home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / tetujin / src / tetusub.c < prev   
Text File  |  1994-11-16  |  64KB  |  2,575 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <file_dlg.h>
  9. #include <wgb.h>
  10. #include <egb.h>
  11. #include <mos.h>
  12. #include <snd.h>
  13. #include <tifflib.h>
  14. #include <guidbg.h>
  15. #include "tetujin.h"
  16. #include "poly.h"
  17. #include "g_eff.h"
  18.  
  19. #undef    SHADE_SIZE    /* gui.hでは2だがこのprogramに限って強制的に0 */
  20. #define SHADE_SIZE 0
  21. #define EFFECTCOUNT 11
  22.  
  23. /* abou */
  24. int    alertId = -1 ;
  25. int    messageId[4] = -1 ;
  26. int    dspIconId = -1 ;
  27. int    aboutOKBtnId = -1 ;
  28. int    aboutNumId = -1 ;
  29. /* desk */
  30. int    baseDialogId = -1 ;
  31. int    menubarId = -1 ;
  32. int    menuId = -1 ;
  33. int    mItemId[3] = -1 ;
  34. int    SDKmenuId = -1 ;
  35. int    SDKmItemId[3] = -1 ;
  36. int    fileMenuId = -1 ;
  37. int    fileMItemId[3] = -1 ;
  38. int    effectMenuId = -1 ;
  39. int    effectMItemId[EFFECTCOUNT] = -1 ;
  40. int    effectSpaceMItemId = -1 ;
  41. int    effectUndoMItemId = -1 ;
  42. int    quitIconId = -1 ;
  43. int    outIconId = -1 ;
  44. /* error */
  45. int    errorId = -1 ;
  46. int    errorOKBtnId = -1 ;
  47. int    errorIconId = -1 ;
  48. int    errormessage[2] = -1 ;
  49. /* set */
  50. int    baseSetupDialogId = -1 ;
  51. int    baseSetupDialogId2 = -1 ;
  52. int    baseSetupMesId[10] = -1 ;
  53. int    baseSetupModeTitleMesId = -1 ;
  54. int    baseSetupNumId[4] = -1 ;
  55. int    setupTIconId[6] = -1 ;
  56. int    setupAreaTIconId[3] = -1 ;
  57. int    baseSetupModeMesId[6] = -1 ;
  58. int    baseScrId[4] = -1 ;
  59. int    baseSDBtnId[2] = -1 ;
  60. int    baseSetupTitleMesId = -1 ;
  61. /* filesオプション用 */
  62. int    fileSubDialogId = -1 ;
  63. int    fileBtnId[3] = -1 ;
  64. int    fileMesId[3] = -1 ;
  65. /* window用影の存在 */
  66. int    windowId = -1 ;
  67. int    vscrollId = -1 ;
  68. int    hscrollId = -1 ;
  69.  
  70. /* 実態(メインソースにて影から作りだす実態) */
  71. GRAPHWIN window[WINCOUNT] = -1 ;    /* window実態kobj */
  72.  
  73. int boundWidth ;    /* 横の解像度(512/640) */
  74.  
  75. static int effectNum = -1 ;
  76. BASICSET effectSet[EFFECTCOUNT] = {
  77.                             { "平滑化フィルタ(RGB)",
  78.     
  79.                               3,
  80.                               "混合比(0~100)", 100, 0, 100,
  81.                               "強さ(0~100)", 80, 0, 100,
  82.                               "輪郭線保存度(0~100)", 50, 0, 100,
  83.                               "", 0, 0, 100,
  84.  
  85.                               0,
  86.                               "",
  87.                               "",
  88.                               "",
  89.                               "",
  90.                               "",
  91.                               "",
  92.                               "",
  93.                               0,
  94.  
  95.                               0
  96.                             },
  97.  
  98.                             { "平滑化フィルタ(Y)",
  99.     
  100.                               3,
  101.                               "混合比(0~100)", 100, 0, 100,
  102.                               "強さ(0~100)", 80, 0, 100,
  103.                               "輪郭線保存度(0~100)", 50, 0, 100,
  104.                               "", 0, 0, 100,
  105.  
  106.                               0,
  107.                               "",
  108.                               "",
  109.                               "",
  110.                               "",
  111.                               "",
  112.                               "",
  113.                               "",
  114.                               0,
  115.  
  116.                               0
  117.                             },
  118.  
  119.                             { "シャープネス(RGB)",
  120.     
  121.                               3,
  122.                               "混合比(0~100)", 100, 0, 100,
  123.                               "強さ(0~100)", 80, 0, 100,
  124.                               "ノイズ阻止率(0~100)", 50, 0, 100,
  125.                               "", 0, 0, 100,
  126.  
  127.                               0,
  128.                               "",
  129.                               "",
  130.                               "",
  131.                               "",
  132.                               "",
  133.                               "",
  134.                               "",
  135.                               0,
  136.  
  137.                               0
  138.                             },
  139.  
  140.                             { "シャープネス(Y)",
  141.     
  142.                               3,
  143.                               "混合比(0~100)", 100, 0, 100,
  144.                               "強さ(0~100)", 80, 0, 100,
  145.                               "ノイズ阻止率(0~100)", 50, 0, 100,
  146.                               "", 0, 0, 100,
  147.  
  148.                               0,
  149.                               "",
  150.                               "",
  151.                               "",
  152.                               "",
  153.                               "",
  154.                               "",
  155.                               "",
  156.                               0,
  157.  
  158.                               0
  159.                             },
  160.  
  161.                             { "メディアン・フィルタ(RGB)",
  162.     
  163.                               2,
  164.                               "混合比(0~100)", 100, 0, 100,
  165.                               "輪郭線保存度(0~100)", 30, 0, 100,
  166.                               "", 0, 0, 100,
  167.                               "", 0, 0, 100,
  168.  
  169.                               0,
  170.                               "",
  171.                               "",
  172.                               "",
  173.                               "",
  174.                               "",
  175.                               "",
  176.                               "",
  177.                               0,
  178.  
  179.                               0
  180.                             },
  181.  
  182.                             { "メディアン・フィルタ(Y)",
  183.     
  184.                               2,
  185.                               "混合比(0~100)", 100, 0, 100,
  186.                               "輪郭線保存度(0~100)", 30, 0, 100,
  187.                               "", 0, 0, 100,
  188.                               "", 0, 0, 100,
  189.  
  190.                               0,
  191.                               "",
  192.                               "",
  193.                               "",
  194.                               "",
  195.                               "",
  196.                               "",
  197.                               "",
  198.                               0,
  199.  
  200.                               0
  201.                             },
  202.  
  203.                             { "デジタイズ・スムーサ",
  204.     
  205.                               2,
  206.                               "混合比(0~100)", 100, 0, 100,
  207.                               "ディテール保存度(0~100)", 50, 0, 100,
  208.                               "", 0, 0, 100,
  209.                               "", 0, 0, 100,
  210.  
  211.                               4,
  212.                               "モード",
  213.                               "奇数ライン(弱)",
  214.                               "奇数ライン(強)",
  215.                               "偶数ライン(弱)",
  216.                               "偶数ライン(強)",
  217.                               "",
  218.                               "",
  219.                               0,
  220.  
  221.                               0
  222.                             },
  223.  
  224.                             { "ファジィ・レガート",
  225.     
  226.                               2,
  227.                               "混合比(0~100)", 100, 0, 100,
  228.                               "センサー(0~100)", 88, 0, 100,
  229.                               "", 0, 0, 100,
  230.                               "", 0, 0, 100,
  231.  
  232.                               0,
  233.                               "",
  234.                               "",
  235.                               "",
  236.                               "",
  237.                               "",
  238.                               "",
  239.                               "",
  240.                               0,
  241.  
  242.                               0
  243.                             },
  244.  
  245.                             { "輝度データの平坦化(要時間)",
  246.     
  247.                               3,
  248.                               "混合比(0~100)", 100, 0, 100,
  249.                               "輝度最小値(0~255)", 0, 0, 255,
  250.                               "輝度最大値(0~255)", 255, 0, 255,
  251.                               "", 0, 0, 100,
  252.  
  253.                               2,
  254.                               "輝度範囲の設定方法",
  255.                               "手  動",
  256.                               "自  動",
  257.                               "",
  258.                               "",
  259.                               "",
  260.                               "",
  261.                               0,
  262.  
  263.                               0
  264.                             },
  265.  
  266.                             { "色の再配置(要長時間)",
  267.     
  268.                               1,
  269.                               "混合比(0~100)", 100, 0, 100,
  270.                               "", 0, 0, 100,
  271.                               "", 0, 0, 100,
  272.                               "", 0, 0, 100,
  273.  
  274.                               3,
  275.                               "モード",
  276.                               "色の採集",
  277.                               "色の平坦再配置",
  278.                               "色の単純再配置",
  279.                               "",
  280.                               "",
  281.                               "",
  282.                               0,
  283.  
  284.                               0
  285.                             },
  286.  
  287.                             { "YUV変換 & 減階調",
  288.     
  289.                               4,
  290.                               "混合比(0~100)", 100, 0, 100,
  291.                               "輝度(Y) の階調", 64, 0, 256,
  292.                               "色相(Cb)の階調", 16, 0, 256,
  293.                               "色相(Cr)の階調", 16, 0, 256,
  294.  
  295.                               4,
  296.                               "色相のまびき",
  297.                               "まびきなし",
  298.                               "横方向まびき",
  299.                               "縦方向まびき",
  300.                               "縦 横 まびき",
  301.                               "",
  302.                               "",
  303.                               0,
  304.  
  305.                               0
  306.                             }
  307.                         } ;
  308.  
  309. char polygonBuffer[ 640*512/8 ] ;    /* ポリゴン指定作業領域 */
  310.  
  311. char tifPath[100] ;            /*  読み込みパス名 */
  312.  
  313. char *undoBuf = NULL ;        /*  アンドウバッファ  */
  314. char *alphaBuf = NULL ;
  315. int  undoLot = 0 ;
  316.  
  317. int outMode = 0 ;        /*  0:normal display 1:拡大 display */
  318.  
  319. static int actId ;            /*    どのウィンドウがアクティブかをしめす変数    */
  320. static int windowflg = 0 ;    /*    ウィンドウが何枚開いているかをしめす変数    */
  321. static int outLupx, outLupy ;    /*  拡大時の表示左上座標 */
  322. static int saveMode = 0 ;        /*  save mode 0:1600万色 1:32768色 */
  323. static int saveCompMode = 0 ;    /*  save mode 0:normal, 1:comp. */
  324.  
  325. extern char    *guiEgbPtr ;            /*    EGB のワークアドレス    */
  326.  
  327.  
  328.  
  329. /***** エフェクトコマンド実行ルーチン *****/
  330.  
  331. static execx, execy, execAreaMode ;        /* リード&ライト関数用の変数 */
  332. static char *execOutBuf ;
  333.  
  334. /* アンドゥバッファからのリード関数 */
  335. static int execRead1( int x, int y, unsigned char *a )
  336. {
  337.     if( x < 0 )x = 0 ;
  338.     if( y < 0 )y = 0 ;
  339.     if( x >= execx )x = execx - 1 ;
  340.     if( y >= execy )y = execy - 1 ;
  341.  
  342.     DWORD( a ) = DWORD( undoBuf + (y*execx + x)*3 ) ;
  343.  
  344.     if( execAreaMode < 2 )
  345.         a[3] = getArea( x, y ) ;
  346.     else
  347.         a[3] = 1 ;
  348.  
  349.     return NOERR ;
  350. }
  351.  
  352. /* アウトプットバッファからのリード関数 */
  353. static int execRead2( int x, int y, unsigned char *a )
  354. {
  355.     if( x < 0 )x = 0 ;
  356.     if( y < 0 )y = 0 ;
  357.     if( x >= execx )x = execx - 1 ;
  358.     if( y >= execy )y = execy - 1 ;
  359.  
  360.     DWORD( a ) = DWORD( execOutBuf + (y*execx + x)*3 ) ;
  361.  
  362.     if( execAreaMode < 2 )
  363.         a[3] = getArea( x, y ) ;
  364.     else
  365.         a[3] = 1 ;
  366.  
  367.     return NOERR ;
  368. }
  369.  
  370. /* アウトプットバッファへのライト関数 */
  371. static int execWrite( int x, int y, unsigned char *a )
  372. {
  373.     int d ;
  374.  
  375.     if( x < 0 )x = 0 ;
  376.     if( y < 0 )y = 0 ;
  377.     if( x >= execx )x = execx - 1 ;
  378.     if( y >= execy )y = execy - 1 ;
  379.  
  380.     d = (y*execx + x)*3 ;
  381.     WORD( execOutBuf + d ) = WORD( a ) ;
  382.     BYTE( execOutBuf + d + 2 ) = BYTE( a + 2 ) ;
  383.  
  384.     return NOERR ;
  385. }
  386.  
  387. /* マスクバッファからのリード関数 */
  388. static int execMask( int x, int y )
  389. {
  390.     return 0 ;
  391. }
  392.  
  393. /* エフェクト実行 */
  394. static int execEffect( FRAME areaFrame )
  395. {
  396.     int i, d[5] ;
  397.  
  398.     execOutBuf = window[actId].buf16m ;        /* アウトプットバッファ */
  399.  
  400.     if( effectNum < 0 )return NOERR ;        /* effectの選択がなされてない */
  401.     if( windowflg <= 0 )return NOERR ;        /* windowが開かれてない */
  402.     if( execOutBuf == NULL )return NOERR ;    /* dataがない */
  403.     if( undoBuf == NULL )return NOERR ;        /* アンドゥバッファがない */
  404.  
  405.     execx = window[actId].dx ;                /* 絵の横幅 */
  406.     execy = window[actId].dy ;                /* 絵の縦幅 */
  407.     if( areaFrame.lupx < 0 )areaFrame.lupx = 0 ;    /* はみだしを修正 */
  408.     if( areaFrame.lupy < 0 )areaFrame.lupy = 0 ;
  409.     if( areaFrame.rdwx > execx-1 )areaFrame.rdwx = execx-1 ;
  410.     if( areaFrame.rdwy > execy-1 )areaFrame.rdwy = execy-1 ;
  411.  
  412.     execAreaMode = effectSet[effectNum].areaMode ;
  413.                         /* エリア設定モード(ポリゴン,四角形,全体の区別)の抽出 */
  414.  
  415.     trans( window[actId].buf16m, undoBuf, execx*execy*3 ) ;    /* data→undoBuf */
  416.     trans( window[actId].bufAlpha, alphaBuf, execx*execy ) ;
  417.  
  418.     for( i=0 ; i<4 ; i++ )                    /* 設定値の抽出 */
  419.         d[i] = effectSet[effectNum].set[i].prt ;
  420.     d[4] = effectSet[effectNum].mode ;
  421.  
  422.     switch( effectNum )                        /* エフェクト関数の選択 */
  423.     {
  424.     case 0:
  425.         softnessFilter( areaFrame, d ) ;
  426.         break ;
  427.     case 1:
  428.         ySoftnessFilter( areaFrame, d ) ;
  429.         break ;
  430.     case 2:
  431.         sharpnessFilter( areaFrame, d ) ;
  432.         break ;
  433.     case 3:
  434.         ySharpnessFilter( areaFrame, d ) ;
  435.         break ;
  436.     case 4:
  437.         medianFilter( areaFrame, d ) ;
  438.         break ;
  439.     case 5:
  440.         yMedianFilter( areaFrame, d ) ;
  441.         break ;
  442.     case 6:
  443.         digitizeSmooth( areaFrame, d ) ;
  444.         break ;
  445.     case 7:
  446.         fuzzy( areaFrame, d ) ;
  447.         break ;
  448.     case 8:
  449.         histgram( areaFrame, d ) ;
  450.         break ;
  451.     case 9:
  452.         replace( areaFrame, d ) ;
  453.         break ;
  454.     case 10:
  455.         yuvCnv( areaFrame, d ) ;
  456.         break ;
  457.     }
  458.  
  459.     cov16mTo32k( window[actId].buf16m, window[actId].buf32k, execx*execy ) ;
  460.                                             /* 16M色から32K色への変換 */
  461.     return NOERR ;
  462. }
  463.  
  464. /*** デジタイズ・スムーサ ***/
  465. static int digitizeSmooth( FRAME areaFrame, int *d )
  466. {
  467.     BASICPARA para ;    /* 引数 */
  468.     int mode, line ;
  469.  
  470.         /* 引数の設定 */
  471.  
  472.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  473.     para.alphaSen = 1 ;            /* アルファセンサON */
  474.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  475.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  476.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  477.  
  478.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  479.     para.lupy = areaFrame.lupy ;
  480.     para.rdwx = areaFrame.rdwx ;
  481.     para.rdwy = areaFrame.rdwy ;
  482.  
  483.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  484.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  485.     para.write = execWrite ;        /* write領域書き込み関数 */
  486.     para.mask = execMask ;            /* mask領域読み取り関数 */
  487.  
  488.     mode = d[4] & 1 ;            /* モード */
  489.     line = d[4] >> 1 ;            /* ライン */
  490.  
  491.     g_videoDigitizeSmoother( ¶, mode, line ) ;
  492.  
  493.     g_c_m_Filter( ¶, d[1]/5 ) ;
  494.  
  495.     return NOERR ;
  496. }
  497.  
  498. /*** メディアン・フィルター ***/
  499. static int medianFilter( FRAME areaFrame, int *d )
  500. {
  501.     BASICPARA para ;    /* 引数 */
  502.     int k ;
  503.  
  504.         /* 引数の設定 */
  505.  
  506.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  507.     para.alphaSen = 1 ;            /* アルファセンサON */
  508.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  509.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  510.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  511.  
  512.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  513.     para.lupy = areaFrame.lupy ;
  514.     para.rdwx = areaFrame.rdwx ;
  515.     para.rdwy = areaFrame.rdwy ;
  516.  
  517.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  518.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  519.     para.write = execWrite ;        /* write領域書き込み関数 */
  520.     para.mask = execMask ;            /* mask領域読み取り関数 */
  521.  
  522.     g_medianFilter( ¶ ) ;
  523.  
  524.     k = (100 - d[1]) / 5 ;
  525.     if( d[1] == 0 )
  526.         k = 256 ;
  527.  
  528.     g_s_c_Filter( ¶, k ) ;
  529.  
  530.     return NOERR ;
  531. }
  532.  
  533. static int yMedianFilter( FRAME areaFrame, int *d )
  534. {
  535.     BASICPARA para ;    /* 引数 */
  536.     int k ;
  537.  
  538.         /* 引数の設定 */
  539.  
  540.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  541.     para.alphaSen = 1 ;            /* アルファセンサON */
  542.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  543.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  544.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  545.  
  546.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  547.     para.lupy = areaFrame.lupy ;
  548.     para.rdwx = areaFrame.rdwx ;
  549.     para.rdwy = areaFrame.rdwy ;
  550.  
  551.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  552.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  553.     para.write = execWrite ;        /* write領域書き込み関数 */
  554.     para.mask = execMask ;            /* mask領域読み取り関数 */
  555.  
  556.     g_yMedianFilter( ¶ ) ;
  557.  
  558.     k = (100 - d[1]) / 5 ;
  559.     if( d[1] == 0 )
  560.         k = 256 ;
  561.  
  562.     g_s_c_yFilter( ¶, k ) ;
  563.  
  564.     return NOERR ;
  565. }
  566.  
  567. /*** ファジィレガート ***/
  568. static int fuzzy( FRAME areaFrame, int *d )
  569. {
  570.     BASICPARA para ;    /* 引数 */
  571.     int mode, fuzzySen ;
  572.  
  573.         /* 引数の設定 */
  574.  
  575.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  576.     para.alphaSen = 1 ;            /* アルファセンサON */
  577.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  578.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  579.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  580.  
  581.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  582.     para.lupy = areaFrame.lupy ;
  583.     para.rdwx = areaFrame.rdwx ;
  584.     para.rdwy = areaFrame.rdwy ;
  585.  
  586.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  587.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  588.     para.write = execWrite ;        /* write領域書き込み関数 */
  589.     para.mask = execMask ;            /* mask領域読み取り関数 */
  590.  
  591.     mode = 1 ;                    /* モード 1 (RGBのみの処理) */
  592.     fuzzySen = d[1]*256/100 ;    /* ファジィセンサの感度設定 */
  593.  
  594.     g_fuzzyLegato( ¶, mode, fuzzySen ) ; /* ファジィレガート呼び出し */
  595.  
  596.     return NOERR ;
  597. }
  598.  
  599. /*** 輝度ヒストグラム平坦化 ***/
  600. static int histgram( FRAME areaFrame, int *d )
  601. {
  602.     BASICPARA para ;    /* 引数 */
  603.  
  604.         /* 引数の設定 */
  605.  
  606.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  607.     para.alphaSen = 1 ;            /* アルファセンサON */
  608.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  609.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  610.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  611.  
  612.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  613.     para.lupy = areaFrame.lupy ;
  614.     para.rdwx = areaFrame.rdwx ;
  615.     para.rdwy = areaFrame.rdwy ;
  616.  
  617.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  618.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  619.     para.write = execWrite ;        /* write領域書き込み関数 */
  620.     para.mask = execMask ;            /* mask領域読み取り関数 */
  621.  
  622.     g_histgramAverager( window[actId].buf32k, ¶, d[4], d[1], d[2] ) ;
  623.  
  624.     return NOERR ;
  625. }
  626.  
  627. /*** 色の再配置 ***/
  628. static int replace( FRAME areaFrame, int *d )
  629. {
  630.     BASICPARA para ;    /* 引数 */
  631.     int wkMax ;
  632.  
  633.         /* 引数の設定 */
  634.  
  635.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  636.     para.alphaSen = 1 ;            /* アルファセンサON */
  637.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  638.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  639.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  640.  
  641.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  642.     para.lupy = areaFrame.lupy ;
  643.     para.rdwx = areaFrame.rdwx ;
  644.     para.rdwy = areaFrame.rdwy ;
  645.  
  646.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  647.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  648.     para.write = execWrite ;        /* write領域書き込み関数 */
  649.     para.mask = execMask ;            /* mask領域読み取り関数 */
  650.  
  651.     wkMax = window[actId].dx * window[actId].dy ;    /* ワークエリアの大きさ */
  652.  
  653.     g_replaceColors( wkMax, window[actId].buf32k, ¶, d[4] ) ;
  654.  
  655.     return NOERR ;
  656. }
  657.  
  658. /*** yuv変換&減階調 ***/
  659. static int yuvCnv( FRAME areaFrame, int *d )
  660. {
  661.     BASICPARA para ;    /* 引数 */
  662.  
  663.         /* 引数の設定 */
  664.  
  665.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  666.     para.alphaSen = 1 ;            /* アルファセンサON */
  667.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  668.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  669.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  670.  
  671.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  672.     para.lupy = areaFrame.lupy ;
  673.     para.rdwx = areaFrame.rdwx ;
  674.     para.rdwy = areaFrame.rdwy ;
  675.  
  676.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  677.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  678.     para.write = execWrite ;        /* write領域書き込み関数 */
  679.     para.mask = execMask ;            /* mask領域読み取り関数 */
  680.  
  681.     g_yuvConv( ¶, d[1], d[2], d[3], d[4] ) ;
  682.  
  683.     return NOERR ;
  684. }
  685.  
  686. /*** 平滑化フィルタ ***/
  687. static int softnessFilter( FRAME areaFrame, int *d )
  688. {
  689.     BASICPARA para ;    /* 引数 */
  690.     int k ;
  691.  
  692.         /* 引数の設定 */
  693.  
  694.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  695.     para.alphaSen = 1 ;            /* アルファセンサON */
  696.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  697.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  698.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  699.  
  700.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  701.     para.lupy = areaFrame.lupy ;
  702.     para.rdwx = areaFrame.rdwx ;
  703.     para.rdwy = areaFrame.rdwy ;
  704.  
  705.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  706.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  707.     para.write = execWrite ;        /* write領域書き込み関数 */
  708.     para.mask = execMask ;            /* mask領域読み取り関数 */
  709.  
  710.     g_softnessFilter( ¶, d[1]*228/100 ) ;
  711.  
  712.     k = (100 - d[2]) / 5 ;
  713.     if( d[2] == 0 )
  714.         k = 256 ;
  715.  
  716.     g_s_c_Filter( ¶, k ) ;
  717.  
  718.     return NOERR ;
  719. }
  720.  
  721. static int ySoftnessFilter( FRAME areaFrame, int *d )
  722. {
  723.     BASICPARA para ;    /* 引数 */
  724.     int k ;
  725.  
  726.         /* 引数の設定 */
  727.  
  728.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  729.     para.alphaSen = 1 ;            /* アルファセンサON */
  730.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  731.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  732.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  733.  
  734.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  735.     para.lupy = areaFrame.lupy ;
  736.     para.rdwx = areaFrame.rdwx ;
  737.     para.rdwy = areaFrame.rdwy ;
  738.  
  739.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  740.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  741.     para.write = execWrite ;        /* write領域書き込み関数 */
  742.     para.mask = execMask ;            /* mask領域読み取り関数 */
  743.  
  744.     g_ySoftnessFilter( ¶, d[1]*228/100 ) ;
  745.  
  746.     k = (100 - d[2]) / 5 ;
  747.     if( d[2] == 0 )
  748.         k = 256 ;
  749.  
  750.     g_s_c_yFilter( ¶, k ) ;
  751.  
  752.     return NOERR ;
  753. }
  754.  
  755. /*** シャープネス ***/
  756. static int sharpnessFilter( FRAME areaFrame, int *d )
  757. {
  758.     BASICPARA para ;    /* 引数 */
  759.  
  760.         /* 引数の設定 */
  761.  
  762.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  763.     para.alphaSen = 1 ;            /* アルファセンサON */
  764.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  765.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  766.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  767.  
  768.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  769.     para.lupy = areaFrame.lupy ;
  770.     para.rdwx = areaFrame.rdwx ;
  771.     para.rdwy = areaFrame.rdwy ;
  772.  
  773.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  774.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  775.     para.write = execWrite ;        /* write領域書き込み関数 */
  776.     para.mask = execMask ;            /* mask領域読み取り関数 */
  777.  
  778.     g_softnessFilter( ¶, -d[1]*256*2/100 ) ;
  779.  
  780.     g_c_m_Filter( ¶, d[2]/5 ) ;
  781.  
  782.     return NOERR ;
  783. }
  784.  
  785. static int ySharpnessFilter( FRAME areaFrame, int *d )
  786. {
  787.     BASICPARA para ;    /* 引数 */
  788.  
  789.         /* 引数の設定 */
  790.  
  791.     para.mix = d[0]*256/100 ;    /* ミクシングレートの指定 */
  792.     para.alphaSen = 1 ;            /* アルファセンサON */
  793.     para.maskSen = 0 ;            /* マスクセンサON (1以上でON) */
  794.     para.colorMax = 255 ;        /* RGBデータの最大値255 */
  795.     para.alphaMax = 1 ;            /* アルファデータの最大値 */
  796.  
  797.     para.lupx = areaFrame.lupx ;            /* 座表設定 */
  798.     para.lupy = areaFrame.lupy ;
  799.     para.rdwx = areaFrame.rdwx ;
  800.     para.rdwy = areaFrame.rdwy ;
  801.  
  802.     para.read1 = execRead1 ;        /* read領域読み取り関数 */
  803.     para.read2 = execRead2 ;        /* write領域読み取り関数 */
  804.     para.write = execWrite ;        /* write領域書き込み関数 */
  805.     para.mask = execMask ;            /* mask領域読み取り関数 */
  806.  
  807.     g_ySoftnessFilter( ¶, -d[1]*256*2/100 ) ;
  808.  
  809.     g_c_m_yFilter( ¶, d[2]/5 ) ;
  810.  
  811.     return NOERR ;
  812. }
  813.  
  814. /***** ファイル操作ルーチン *****/
  815.  
  816. /* 新規 */
  817. /*    initDataIGRDSK:fileMItemId[0]:MJ_MITEML40の呼び出し関数    */
  818. int    fileFunc0(kobj, messId, argc, pev, trigger)
  819. int        kobj ;
  820. int        messId ;
  821. int        argc ;
  822. EVENT    *pev ;
  823. int        trigger ;
  824. {
  825.     return NOERR ;
  826. }
  827.  
  828. /* LOAD */
  829. /*    initDataIGRDSK:fileMItemId[1]:MJ_MITEML40の呼び出し関数    */
  830. int    fileFunc1(kobj, messId, argc, pev, trigger)
  831. int        kobj ;
  832. int        messId ;
  833. int        argc ;
  834. EVENT    *pev ;
  835. int        trigger ;
  836. {
  837.     int        i, ret ;
  838.     char     *namePoint ;
  839.     char    path[100] ;
  840.     char    *ExtStr[] = { "*.TIF", NULL } ;
  841.  
  842.     /* メニューを使えないようにする */
  843.     MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
  844.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  845.  
  846.     /*    ウィンドウをこれ以上表示できない */
  847.     if( windowflg == WINCOUNT )
  848.     {
  849.         ret = OUT_OF_WINDOW ;
  850.         goto e00 ;
  851.     }
  852.  
  853.     _rstrncpy( path, tifPath, 80 ) ;    /* pathにパス名をcopy */
  854.     ret = fileSelecter( path, ExtStr, "TIFF読込", "読  込", "取  消");
  855.     if( ret )
  856.     {
  857.         /* メニューを使えるように戻す */
  858.         MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
  859.         MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  860.         return NOERR ;
  861.     }
  862.     else
  863.     {
  864.         /* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
  865.         file_kakuchousi_set( tifPath, path, ".TIF" ) ;
  866.     }
  867.  
  868.     namePoint = path ;
  869.     for( i=0 ; i<80 ; i++ )
  870.     {
  871.         char s ;
  872.  
  873.         s = path[i] ;
  874.         if( (s == '\\') || (s == ':') )namePoint = path + i + 1 ;
  875.         if( s == '\0' )break ;
  876.     }
  877.  
  878.     char *work ;
  879.     int comp, fill ;
  880.     long strip, clut ;
  881.     int lot ;
  882.     char *buf ;
  883.     int col, dx, dy ;
  884.  
  885.     if( tiffCheckHead( tifPath, &col, &dx, &dy, &comp, &fill, &strip, &clut) )
  886.     {
  887.         ret = ILLEGAL_DATA ;
  888.         goto e00 ;
  889.     }
  890.  
  891.     lot = TL_getLot() ;
  892.     if( (buf = (char *)TL_mallocMemory( lot, dx * dy * 6 )) == NULL )
  893.     {
  894.         ret = OUT_OF_MEMORY ;
  895.         goto e00 ;
  896.     }
  897.  
  898.     if
  899.     (
  900.       ( work = (char *)TL_malloc( 
  901.             DECOMP_WORK_SIZE + LOADBUFSIZE + EXPBUFSIZE + MinMem ) )
  902.                  == NULL
  903.     )
  904.     {
  905.         ret = OUT_OF_MEMORY ;
  906.         TL_freeLot( lot ) ;
  907.         goto e00 ;
  908.     }
  909.  
  910.     SetMouse32k( 81, 0x7fff, 0x0 ) ;    /* マウスカーソルをウエイト表示に */
  911.     ret = tifLoad16m( work, tifPath, buf, &dx, &dy ) ;
  912.     if( ret )
  913.     {
  914.         TL_free( work ) ;
  915.         TL_freeLot( lot ) ;
  916.         goto e00 ;
  917.     }
  918.  
  919.     /* alpha領域clear */
  920.     for( i=dx*dy*3 ; i<dx*dy*4 ; i += 4 )
  921.         DWORD( buf + i ) = 0 ;
  922.  
  923.     cov16mTo32k( buf, buf + dx*dy*4, dx*dy ) ;
  924.  
  925.     TL_free( work ) ;
  926.     ret = geneWindow( namePoint, tifPath, lot,
  927.                         buf, buf + dx*dy*3, buf + dx*dy*4, dx, dy ) ;
  928.  
  929. e00:
  930.     SetMouse32k( 80, 0x7fff, 0x0 ) ;
  931.  
  932.     /* メニューを使えるように戻す */
  933.     MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
  934.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  935.  
  936.     if( ret )
  937.             errorCheck( ret ) ;
  938.     return NOERR ;
  939. }
  940.  
  941. /* SAVE */
  942. /*    initDataIGRDSK:fileMItemId[2]:MJ_MITEML40の呼び出し関数    */
  943. int    fileFunc2(kobj, messId, argc, pev, trigger)
  944. int        kobj ;
  945. int        messId ;
  946. int        argc ;
  947. EVENT    *pev ;
  948. int        trigger ;
  949. {
  950.     int        ret ;
  951.     char    path[100] ;
  952.     char    *ExtStr[] = { "*.TIF", NULL } ;
  953.  
  954.     /* メニューを使えないようにする */
  955.     MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
  956.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  957.  
  958.     /*    ウィンドウが開かれてない */
  959.     if( (windowflg == 0) || (window[actId].buf16m == NULL) )
  960.     {
  961.         ret = NO_WINDOW ;
  962.         goto e00 ;
  963.     }
  964.  
  965.     _rstrncpy( path, window[actId].savePath, 80 ) ;    /* pathにパス名をcopy */
  966.     ret = fileSelecter2( path, ExtStr, "TIFF保存", "保  存", "取  消");
  967.     if( ret )
  968.     {
  969.         /* メニューを使えるように戻す */
  970.         MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
  971.         MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  972.         return NOERR ;
  973.     }
  974.     else
  975.     {
  976.         /* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
  977.         file_kakuchousi_set( window[actId].savePath, path, ".TIF" ) ;
  978.     }
  979.  
  980.     char *work ;
  981.  
  982.     if( (work=(char *)TL_malloc(COMP_WORK_SIZE+SAVEBUFSIZE+GETBUFSIZE))
  983.              == NULL )
  984.     {
  985.         ret = OUT_OF_MEMORY ;
  986.         goto e00 ;
  987.     }
  988.  
  989.     SetMouse32k( 81, 0x7fff, 0x0 ) ;    /* マウスカーソルをウエイト表示に */
  990.     if( saveMode == 0 )
  991.         ret = tifSave32kAnd16m(
  992.             work, window[actId].savePath, window[actId].buf16m,
  993.             24, saveCompMode, window[actId].dx, window[actId].dy ) ;
  994.     else
  995.         ret = tifSave32kAnd16m(
  996.             work, window[actId].savePath, window[actId].buf32k,
  997.             16, saveCompMode, window[actId].dx, window[actId].dy ) ;
  998.     SetMouse32k( 80, 0x7fff, 0x0 ) ;
  999.     if( ret )
  1000.     {
  1001.         TL_free( work ) ;
  1002.         goto e00 ;
  1003.     }
  1004.     TL_free( work ) ;
  1005.  
  1006. e00:
  1007.     /* メニューを使えるように戻す */
  1008.     MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
  1009.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  1010.  
  1011.     if( ret )
  1012.             errorCheck( ret ) ;
  1013.     return NOERR ;
  1014. }
  1015.  
  1016.  
  1017. /***** エフェクトコマンド設定ルーチン *****/
  1018.  
  1019. /*    initDataIGRDSK:effectMItemId[0]:MJ_MITEML40の呼び出し関数    */
  1020. /*    initDataIGRDSK:effectMItemId[1]:MJ_MITEML40の呼び出し関数    */
  1021. /*    initDataIGRDSK:effectMItemId[2]:MJ_MITEML40の呼び出し関数    */
  1022. /*    initDataIGRDSK:effectMItemId[3]:MJ_MITEML40の呼び出し関数    */
  1023. /*    initDataIGRDSK:effectMItemId[4]:MJ_MITEML40の呼び出し関数    */
  1024. /*    initDataIGRDSK:effectMItemId[5]:MJ_MITEML40の呼び出し関数    */
  1025. /*    initDataIGRDSK:effectMItemId[6]:MJ_MITEML40の呼び出し関数    */
  1026. /*    initDataIGRDSK:effectMItemId[7]:MJ_MITEML40の呼び出し関数    */
  1027. int    effectFunc(kobj, messId, argc, pev, trigger)
  1028. int        kobj ;
  1029. int        messId ;
  1030. int        argc ;
  1031. EVENT    *pev ;
  1032. int        trigger ;
  1033. {
  1034.     int i ;
  1035.     int    alertobj ;      /*   現在のALERTOBJを退避する変数    */
  1036.  
  1037.     for( i=0 ; i<EFFECTCOUNT ; i++ )
  1038.     {
  1039.         if( kobj == effectMItemId[i] )
  1040.             break ;
  1041.     }
  1042.     if( i >= EFFECTCOUNT )return NOERR ;
  1043.  
  1044.     /* メニューを使えないようにする */
  1045.     MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
  1046.     MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;
  1047.  
  1048.     effectNum = i ;
  1049.     setEffect( &(effectSet[i]) ) ;    /* 操作パネルの初期設定 */
  1050.  
  1051.     alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避     */
  1052.     MMI_SetAlertObj( baseSetupDialogId ) ;
  1053.     MMI_SendMessage( baseSetupDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  1054.     MMI_SendMessage( baseSetupDialogId, MM_SHOW, 0 ) ; /* 見せる */
  1055.  
  1056.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  1057.  
  1058.     MMI_SendMessage( baseSetupDialogId, MM_ERASE, 0 ) ;
  1059.     MMI_SendMessage( baseSetupDialogId, MM_DETACH, 0 ) ;
  1060.     MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す        */
  1061.  
  1062.     if( windowflg && (effectNum >= 0) && (undoBuf == NULL) )
  1063.     {
  1064.         makeUndoBuf() ;
  1065.  
  1066.         if( undoBuf == NULL )
  1067.             errorCheck( OUT_OF_MEMORY ) ;                /* undoBufがない */
  1068.     }
  1069.  
  1070.     /* メニューを使えるように戻す */
  1071.     MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
  1072.     MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
  1073.     return NOERR ;
  1074. }
  1075.  
  1076. /* 設定パネルの初期設定 */
  1077. static setEffect( BASICSET *set )
  1078. {
  1079.     HYPER hyp ;
  1080.     int dx, dy, i ;
  1081.  
  1082. /* まっ先にセンタリングするから,後でアタッチ,デタッチをしても位置がずれない */
  1083.     MMI_SendMessage( baseSetupDialogId, MM_GETHYPER, 1, &hyp ) ; /* センタリング */
  1084.     dx = hyp.fr.rdwx - hyp.fr.lupx ;
  1085.     dy = hyp.fr.rdwy - hyp.fr.lupy ;
  1086.     hyp.fr.lupx = 256 - dx / 2 ;
  1087.     hyp.fr.lupy = 240 - dy / 2 ;
  1088.     hyp.fr.rdwx = hyp.fr.lupx + dx ;
  1089.     hyp.fr.rdwy = hyp.fr.lupy + dy ;
  1090.     MMI_SendMessage( baseSetupDialogId, MM_MOVE, 1, &(hyp.fr) ) ;
  1091.  
  1092.     /*    タイトルを設定する  */
  1093.     MMI_SendMessage( baseSetupTitleMesId, MM_SETMSG, 1, set->title ) ;
  1094.  
  1095.     /*  各種設定項目  */
  1096.     for( i=0 ; i<4 ; i++ )
  1097.     {
  1098.         MMI_SendMessage( baseSetupMesId[i], MM_SETMSG,
  1099.                                             1, (set->set[i]).title ) ;
  1100.         MMI_SendMessage( baseSetupNumId[i], MM_SETNUMBOX, 5,
  1101.              (set->set[i]).prt, (set->set[i]).min, (set->set[i]).max, 1, 0 ) ;
  1102.         MMI_SendMessage( baseScrId[i], MM_SETSCROLL, 5,
  1103.              (set->set[i]).prt, (set->set[i]).min, (set->set[i]).max, 1, 1 ) ;
  1104.     }
  1105.  
  1106.     /*    モードのタイトルを設定する  */
  1107.     MMI_SendMessage( baseSetupModeTitleMesId, MM_SETMSG, 1, set->modeTitle ) ;
  1108.     for( i=0 ; i<6 ; i++ )
  1109.         MMI_SendMessage( baseSetupModeMesId[i], MM_SETMSG,
  1110.                                                         1, set->modeName[i] ) ;
  1111.     /* 選択されたモードのボタン設定 */
  1112.     for( i=0 ; i<4 ; i++ )
  1113.         MTL_resetFlagObj( setupTIconId[i], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
  1114.     MTL_setFlagObj( setupTIconId[ set->mode ], (MS_UNSELECT | MS_TOGGLE) ) ;
  1115.  
  1116.     /* 選択されたエリアモードのボタン設定 */
  1117.     for( i=0 ; i<3 ; i++ )
  1118.         MTL_resetFlagObj( setupAreaTIconId[i], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
  1119.     MTL_setFlagObj( setupAreaTIconId[ set->areaMode ],
  1120.                             (MS_UNSELECT | MS_TOGGLE) );
  1121.  
  1122.     /*  各種設定項目のアタッチorデタッチの設定  */
  1123.     for( i=0 ; i<4 ; i++ )
  1124.     {
  1125.         if( i<(set->setNum) )
  1126.         {
  1127.             MMI_SendMessage( baseSetupNumId[i], MM_ATTACH,
  1128.                                             1, baseSetupDialogId2 ) ;
  1129.             MMI_SendMessage( baseScrId[i], MM_ATTACH,
  1130.                                             1, baseSetupDialogId2 ) ;
  1131.         }
  1132.         else
  1133.         {
  1134.             MMI_SendMessage( baseSetupNumId[i], MM_DETACH, 0 ) ;
  1135.             MMI_SendMessage( baseScrId[i], MM_DETACH, 0 ) ;
  1136.         }
  1137.     }
  1138.  
  1139.     /*  モードのアタッチorデタッチの設定  */
  1140.     for( i=0 ; i<6 ; i++ )
  1141.     {
  1142.         /* 文字をボタンの上に持ってくるために,一端デタッチする */
  1143.         MMI_SendMessage( baseSetupModeMesId[i], MM_DETACH, 0 ) ;
  1144.  
  1145.         if( i<(set->modeNum) )
  1146.         {
  1147.             MMI_SendMessage( setupTIconId[i], MM_ATTACH,
  1148.                                             1, baseSetupDialogId2 ) ;
  1149.             MMI_SendMessage( baseSetupModeMesId[i], MM_ATTACH,
  1150.                                             1, baseSetupDialogId2 ) ;
  1151.                                     /* 文字はボタンの後に,アタッチする */
  1152.         }
  1153.         else
  1154.         {
  1155.             MMI_SendMessage( setupTIconId[i], MM_DETACH, 0 ) ;
  1156.         }
  1157.     }
  1158.     return NOERR ;
  1159. }
  1160.  
  1161. /* 数値設定 */
  1162. /*    initDataIGRSET:baseSetupNumId[0]:MJ_NUMBOXL40の呼び出し関数    */
  1163. /*    initDataIGRSET:baseSetupNumId[1]:MJ_NUMBOXL40の呼び出し関数    */
  1164. /*    initDataIGRSET:baseSetupNumId[2]:MJ_NUMBOXL40の呼び出し関数    */
  1165. /*    initDataIGRSET:baseSetupNumId[3]:MJ_NUMBOXL40の呼び出し関数    */
  1166. int    baseSetupNumFunc(kobj, messId, argc, pev, trigger)
  1167. int        kobj ;
  1168. int        messId ;
  1169. int        argc ;
  1170. EVENT    *pev ;
  1171. int        trigger ;
  1172. {
  1173.     int        i, prt , max , min , d1 , d2 ;
  1174.  
  1175.     for( i=0 ; i<4 ; i++ )
  1176.     {
  1177.         if( kobj == baseSetupNumId[i] )
  1178.             break ;
  1179.     }
  1180.     MMI_SendMessage( kobj, MM_GETNUMBOX, 5, &prt, &min, &max, &d1, &d2 ) ;
  1181.     MMI_SendMessage( baseScrId[i], MM_SETSCROLL,
  1182.                                          5,    prt, min, max, 1, 1 ) ;
  1183.     MMI_SendMessage( baseScrId[i], MM_SHOW, 0 ) ;
  1184.     effectSet[effectNum].set[i].prt = prt ;
  1185.  
  1186.     return NOERR ;
  1187. }
  1188.  
  1189. /* スクロール設定 */
  1190. /*    initDataIGRSET:baseScrId[0]:MJ_SCRLL40の呼び出し関数    */
  1191. /*    initDataIGRSET:baseScrId[1]:MJ_SCRLL40の呼び出し関数    */
  1192. /*    initDataIGRSET:baseScrId[2]:MJ_SCRLL40の呼び出し関数    */
  1193. /*    initDataIGRSET:baseScrId[3]:MJ_SCRLL40の呼び出し関数    */
  1194. int    baseSetupScrFunc(kobj, messId, argc, pev, trigger)
  1195. int        kobj ;
  1196. int        messId ;
  1197. int        argc ;
  1198. EVENT    *pev ;
  1199. int        trigger ;
  1200. {
  1201.     int        i, prt , max , min , d1 , d2 ;
  1202.  
  1203.     for( i=0 ; i<4 ; i++ )
  1204.     {
  1205.         if( kobj == baseScrId[i] )
  1206.             break ;
  1207.     }
  1208.     MMI_SendMessage( kobj, MM_GETSCROLL, 5, &prt, &min, &max, &d1, &d2 ) ;
  1209.     MMI_SendMessage( baseSetupNumId[i], MM_SETNUMBOX,
  1210.                                          5,    prt, min, max, 1, 0 ) ;
  1211.     MMI_SendMessage( baseSetupNumId[i], MM_SHOW, 0 ) ;
  1212.     effectSet[effectNum].set[i].prt = prt ;
  1213.  
  1214.     return NOERR ;
  1215. }
  1216.  
  1217. /* モード設定 */
  1218. /*    initDataIGRSET:setupTIconId[0~5]:MJ_TICONL40の呼び出し関数    */
  1219. int    baseSetupTIconFunc(kobj, messId, argc, pev, trigger)
  1220. int        kobj ;
  1221. int        messId ;
  1222. int        argc ;
  1223. EVENT    *pev ;
  1224. int        trigger ;
  1225. {
  1226.     int i ;
  1227.  
  1228.     for( i=0 ; i<6 ; i++ )
  1229.     {
  1230.         if( kobj == setupTIconId[i] )
  1231.             break ;
  1232.     }
  1233.     if( i < 6 )
  1234.     {
  1235.         MTL_setFlagObj( setupTIconId[i], MS_UNSELECT ) ;
  1236.         MTL_resetFlagObj( setupTIconId[ effectSet[effectNum].mode ],
  1237.                             (~(MS_UNSELECT | MS_TOGGLE)) ) ;
  1238.         MMI_SendMessage( setupTIconId[ effectSet[effectNum].mode ],
  1239.                             MM_SHOW, 0 ) ;
  1240.         effectSet[effectNum].mode = i ;
  1241.     }
  1242.     return NOERR ;
  1243. }
  1244.  
  1245. /* エリア設定モード設定 */
  1246. /*    initDataIGRSET:setupAreaTIconId[0]:MJ_TICONL40の呼び出し関数    */
  1247. /*    initDataIGRSET:setupAreaTIconId[1]:MJ_TICONL40の呼び出し関数    */
  1248. /*    initDataIGRSET:setupAreaTIconId[2]:MJ_TICONL40の呼び出し関数    */
  1249. int    baseSetupAreaTIconFunc(kobj, messId, argc, pev, trigger)
  1250. int        kobj ;
  1251. int        messId ;
  1252. int        argc ;
  1253. EVENT    *pev ;
  1254. int        trigger ;
  1255. {
  1256.     int i ;
  1257.  
  1258.     for( i=0 ; i<3 ; i++ )
  1259.     {
  1260.         if( kobj == setupAreaTIconId[i] )
  1261.             break ;
  1262.     }
  1263.     if( i < 3 )
  1264.     {
  1265.         MTL_setFlagObj( setupAreaTIconId[i], MS_UNSELECT ) ;
  1266.         MTL_resetFlagObj( setupAreaTIconId[ effectSet[effectNum].areaMode ],
  1267.                             (~(MS_UNSELECT | MS_TOGGLE)) ) ;
  1268.         MMI_SendMessage( setupAreaTIconId[ effectSet[effectNum].areaMode ],
  1269.                             MM_SHOW, 0 ) ;
  1270.         effectSet[effectNum].areaMode = i ;
  1271.     }
  1272.     return NOERR ;
  1273. }
  1274.  
  1275. /* 実行or取消 */
  1276. /*    initDataIGRSET:baseSDBtnId[1]:MJ_DBUTTONL40の呼び出し関数    */
  1277. /*    initDataIGRSET:baseSDBtnId[0]:MJ_DBUTTONL40の呼び出し関数    */
  1278. int    baseSetupOkFunc(kobj, messId, argc, pev, trigger)
  1279. int        kobj ;
  1280. int        messId ;
  1281. int        argc ;
  1282. EVENT    *pev ;
  1283. int        trigger ;
  1284. {
  1285.     if( kobj != baseSDBtnId[0] )
  1286.         effectNum = -1 ;
  1287.  
  1288.     MMI_SetHaltFlag( TRUE ) ;
  1289.     return NOERR ;
  1290. }
  1291.  
  1292. /***** 画面拡大設定ルーチン *****/
  1293.  
  1294. /* 拡大時において,マウス関係のイベント実行時に,ここを経由 */
  1295. static int outFuncSub( EVENT *pev )
  1296. {
  1297.     int x, y ;
  1298.  
  1299.     x = ((POINT *)&(pev->info))->x ;
  1300.     y = ((POINT *)&(pev->info))->y ;
  1301.     setDisplayArea( x, y ) ;    /* カーソルを画面の中に入れる関数 */
  1302.  
  1303.     switch( pev->what )
  1304.     {
  1305.     case EVMOSDN:
  1306.         MMI_MosOnMethods() ;
  1307.         break ;
  1308.     case EVMOSUP:
  1309.         MMI_MosOffMethods() ;
  1310.         break ;
  1311.     case EVMOSMOVE:
  1312.         MMI_MosMoveMethods( pev ) ;
  1313.         break ;
  1314.     case EVMOSDRAG:
  1315.         MMI_MosDragMethods( pev ) ;
  1316.         break ;
  1317.     }
  1318.     return NOERR ;
  1319. }
  1320.  
  1321. /* 拡大ON,OFF SWITCH */
  1322. /*    initDataIGRDSK:outIconId:MJ_ICONL40の呼び出し関数    */
  1323. int    displayOutFunc(kobj, messId, argc, pev, trigger)
  1324. int        kobj ;
  1325. int        messId ;
  1326. int        argc ;
  1327. EVENT    *pev ;
  1328. int        trigger ;
  1329. {
  1330. /* 注意!!! これらは絶対にstaticでなければいけない */
  1331.     static int ( *eventFunc0 )( EVENT * ) ;
  1332.     static int ( *eventFunc1 )( EVENT * ) ;
  1333.     static int ( *eventFunc3 )( EVENT * ) ;
  1334.     static int ( *eventFunc4 )( EVENT * ) ;
  1335.  
  1336.     if( outMode == 0 )        /* 拡大設定 */
  1337.     {
  1338.         MMI_displayOut( 2, 2 ) ;
  1339.         MMI_displayOutStart() ;
  1340.         outMode = 1 ;
  1341.         outLupx = 256 ; outLupy = 0 ;
  1342.         setDisplayArea( 256, 0 ) ;
  1343.  
  1344.         MMI_SendMessage( kobj , MM_SETSHAPE , 1 , 298 ) ;
  1345.         MMI_SendMessage( kobj , MM_SHOW , 0 ) ;
  1346.  
  1347.         MMI_GetExecEvent( 0, &eventFunc0 ) ;
  1348.         MMI_GetExecEvent( 1, &eventFunc1 ) ;
  1349.         MMI_GetExecEvent( 3, &eventFunc3 ) ;
  1350.         MMI_GetExecEvent( 4, &eventFunc4 ) ;
  1351.         MMI_SetExecEvent( 0, outFuncSub ) ;
  1352.         MMI_SetExecEvent( 1, outFuncSub ) ;
  1353.         MMI_SetExecEvent( 3, outFuncSub ) ;
  1354.         MMI_SetExecEvent( 4, outFuncSub ) ;
  1355.     }
  1356.     else                    /* 拡大解除 */
  1357.     {
  1358.         MMI_displayOut( 1, 1 ) ;
  1359.         MMI_displayOutEnd() ;
  1360.  
  1361.         EGB_displayStart( guiEgbPtr, 3, 0, 0 ) ;
  1362.         EGB_displayStart( guiEgbPtr, 2, 1, 1 ) ;
  1363.         EGB_displayStart( guiEgbPtr, 0, 0, 0 ) ;
  1364.         EGB_displayStart( guiEgbPtr, 1, 0, 0 ) ;
  1365.         EGB_displayStart( guiEgbPtr, 3, boundWidth, 480 ) ;
  1366.  
  1367.         MMI_SendMessage( kobj , MM_SETSHAPE , 1 , 297 ) ;
  1368.         MMI_SendMessage( kobj , MM_SHOW , 0 ) ;
  1369.  
  1370.         MMI_SetExecEvent( 0, eventFunc0 ) ;
  1371.         MMI_SetExecEvent( 1, eventFunc1 ) ;
  1372.         MMI_SetExecEvent( 3, eventFunc3 ) ;
  1373.         MMI_SetExecEvent( 4, eventFunc4 ) ;
  1374.         outMode = 0 ;
  1375.     }
  1376.  
  1377.     return NOERR ;
  1378. }
  1379.  
  1380.  
  1381. /***** ウィンドウ操作関数 *****/
  1382.  
  1383. /* ウィンドウのユーザー関数 */
  1384. /*    initDataIGRWIN:windowId:MJ_WINDOWL40の呼び出し関数    */
  1385. int    windowFunc(kobj, messId, argc, pev, trigger)
  1386. int        kobj ;
  1387. int        messId ;
  1388. int        argc ;
  1389. EVENT    *pev ;
  1390. int        trigger ;
  1391. {
  1392.     FRAME        org ;
  1393.     FRAME        size ;
  1394.     HYPER        winhyp , vschyp, hschyp  ;
  1395.  
  1396.     char        para[64] ;
  1397.     int            act ;
  1398.     int         dx, dy ;
  1399.     int         sw, x, y ;
  1400.     int            ret ;
  1401.     int            error ;
  1402.  
  1403.     WINCLIP        *pwclp ;            /* 枠用の関数の為の変数 */
  1404.     WINCLIP        *pstackVisible ;
  1405.     WINCLIP        *pstackClip ;
  1406.     WINCTRL        *pctrl ;
  1407.     POINT        origin ;
  1408.     POINT        dspOrigin ;
  1409.  
  1410.     /* クリップ枠とビジブル枠を退避する入れ子の関数 */
  1411.     void pushWaku()
  1412.     {
  1413.         origin.y = origin.x = 0 ;
  1414.         MG_PushOrigin( &origin, &dspOrigin ) ;
  1415.         MMI_GetControl( &pctrl ) ;
  1416.         pwclp = WIN_getClipMemory( &pctrl->bound, NULL ) ;
  1417.         WIN_pushVisible( WIN_copyClip( pwclp ), &pstackVisible ) ;
  1418.         WIN_pushClip( pwclp, &pstackClip ) ;
  1419.     }
  1420.  
  1421.     /* クリップ枠とビジブル枠を元に戻す入れ子の関数 */
  1422.     void popWaku()
  1423.     {
  1424.         WIN_popClip( pstackClip ) ;
  1425.         WIN_popVisible( pstackVisible ) ;
  1426.         MG_PopOrigin( &dspOrigin ) ;
  1427.     }
  1428.  
  1429.     /* クリップ枠の絵を表示する入れ子の関数 */
  1430.     void showWaku()
  1431.     {
  1432.         char *buf ;
  1433.  
  1434.         MG_mosDisp( 2 );
  1435.         buf = window[act].buf32k ;
  1436.         if( buf != NULL )
  1437.         {
  1438.             EGB_writeMode(guiEgbPtr,0);    /* XORモードでここに入る場合もあり */
  1439.             EGB_paintMode(guiEgbPtr,0x222);
  1440.  
  1441.             DWORD( para + 0 ) = (unsigned int)buf ;
  1442.             WORD( para + 4 ) = 0x14 ;
  1443.             WORD( para + 6 ) = - window[act].ox ;
  1444.             WORD( para + 8 ) = - window[act].oy ;
  1445.             WORD( para + 10 ) = - window[act].ox + window[act].dx - 1 ;
  1446.             WORD( para + 12 ) = - window[act].oy + window[act].dy - 1 ;
  1447.             WGB_putBlock( guiEgbPtr, 1, para ) ;
  1448.         }
  1449.         MG_mosDisp( 3 );
  1450.     }
  1451.  
  1452.     error = ILLEGAL_FUNCTION ;
  1453.  
  1454.     /*    どのウィンドウから呼ばれたか調べる        */
  1455.     for( act = 0 ; act < WINCOUNT ; act ++ )
  1456.         if( window[act].windowId == kobj )
  1457.              break ;
  1458.  
  1459.     /* SHOW */
  1460.     if( messId == MM_SHOW )
  1461.     {
  1462.         showWaku() ;
  1463.  
  1464.         error = NOERR ;
  1465.     }
  1466.  
  1467.     /*    リサイズの時の処理        */
  1468.     else if( messId == MM_UPDATE )
  1469.     {
  1470.         MMI_SendMessage( kobj , MM_GETUSER , 2 , &org , &size ) ;
  1471.         MMI_SendMessage( kobj , MM_GETHYPER , 1 , &winhyp ) ;
  1472.  
  1473.     /*        ユーザー領域のリサイズ処理                                */
  1474.         /*     影とスクロールバーの分 内側によせる(SHADE_SIZE + BAR_SIZE)    */
  1475.         /*    SHADE_SIZE : GUI.H参照        BAR_SIZE : gratst.H参照            */
  1476.         org.rdwx = winhyp.fr.rdwx - 
  1477.                  ( SHADE_SIZE + BAR_SIZE ) - winhyp.fr.lupx - org.lupx + 1 ;
  1478.         org.rdwy = winhyp.fr.rdwy -
  1479.                  ( SHADE_SIZE + BAR_SIZE ) - winhyp.fr.lupy - org.lupy + 1 ;
  1480.         MMI_SendMessage( kobj , MM_SETUSER, 2, &org, &size );
  1481.  
  1482.     /*        スクロールバーのリサイズ処理                            */
  1483.         MMI_SendMessage( window[act].hscrollId , MM_GETHYPER , 1, &hschyp ) ;
  1484.         hschyp.fr.lupy = winhyp.fr.lupy + org.lupy + org.rdwy ;
  1485.         hschyp.fr.rdwx = winhyp.fr.lupx + org.lupx + org.rdwx ;
  1486.         hschyp.fr.rdwy = hschyp.fr.lupy + BAR_SIZE ;
  1487.         MMI_SendMessage( window[act].hscrollId , MM_SETHYPER , 1, &hschyp ) ;
  1488.  
  1489.         MMI_SendMessage( window[act].vscrollId , MM_GETHYPER , 1, &vschyp ) ;
  1490.         vschyp.fr.lupx = winhyp.fr.lupx + org.lupx + org.rdwx ;
  1491.         vschyp.fr.rdwy = winhyp.fr.lupy + org.lupy + org.rdwy ;
  1492.         vschyp.fr.rdwx = vschyp.fr.lupx + BAR_SIZE ;
  1493.         MMI_SendMessage( window[act].vscrollId , MM_SETHYPER , 1, &vschyp ) ;
  1494.  
  1495.     /*    スクロールバーの設定        */
  1496.         dx = window[act].dx ;
  1497.         dy = window[act].dy ;
  1498.         if( (dx - window[act].ox) < org.rdwx )
  1499.             window[act].ox = dx - org.rdwx ;
  1500.         if( (dy - window[act].oy) < org.rdwy )
  1501.             window[act].oy = dy - org.rdwy ;
  1502.         MMI_SendMessage( window[act].hscrollId, MM_SETSCROLL, 5, 
  1503.                     org.rdwx - 1 + window[act].ox, org.rdwx - 1, dx - 1,
  1504.                             org.rdwx, 1 ) ;
  1505.         MMI_SendMessage( window[act].vscrollId, MM_SETSCROLL, 5, 
  1506.                     org.rdwy - 1 + window[act].oy, org.rdwy - 1, dy - 1,
  1507.                             org.rdwy, 1 ) ;
  1508.  
  1509.         error = NOERR ;
  1510.     }
  1511.  
  1512.     /*    移動時の処理            */
  1513.     else if( messId == MM_MOVE )
  1514.     {
  1515.         error = NOERR ;
  1516.     }
  1517.  
  1518.     /*    mouseが押された時の処理            */
  1519.     else if( messId == MM_MOUSEON )
  1520.     {
  1521.         FRAME areaFrame ;    /* 領域指定の対角座表 */
  1522.  
  1523.         if( effectNum >= 0 )
  1524.         {
  1525.             switch( effectSet[effectNum].areaMode )
  1526.             {
  1527.             case 0:        /* ポリゴン指定 */
  1528.                 if( (ret = polygon1( actId, &areaFrame,
  1529.                         effectSet[effectNum].areaMode)) == NOERR )
  1530.                     polygon2() ;
  1531.                 break ;
  1532.             case 1:        /* 四角形指定 */
  1533.                 if( (ret = rectangle1( actId, &areaFrame,
  1534.                         effectSet[effectNum].areaMode)) == NOERR )
  1535.                     rectangle2() ;
  1536.                 break ;
  1537.             case 2: /* 全画面指定はここで処理する(メリットはWGB関数が使えること) */
  1538.                 ret = 0 ;
  1539.                 MOS_rdpos(&sw,&x,&y) ;
  1540.                 if( sw == 0 )    /* ここで押してないのはやる気なし */
  1541.                 {
  1542.                     ret = -1 ;
  1543.                     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1544.                     break ;
  1545.                 } /* こうしないとwindow切り替え時にeffectが実行されてしまう */
  1546.                 MG_mosDisp( 2 );
  1547.                 EGB_color(guiEgbPtr,0,0x7fff);
  1548.                 EGB_paintMode(guiEgbPtr,0x222);
  1549.                 EGB_writeMode(guiEgbPtr,4);
  1550.                 WORD( para + 0 ) = - window[act].ox ;
  1551.                 WORD( para + 2 ) = - window[act].oy ;
  1552.                 WORD( para + 4 ) = - window[act].ox + window[act].dx - 1 ;
  1553.                 WORD( para + 6 ) = - window[act].oy + window[act].dy - 1 ;
  1554.                 WGB_rectangle(guiEgbPtr,para);
  1555.                 do
  1556.                 {
  1557.                     MOS_rdpos(&sw,&x,&y) ;
  1558.                     if( sw > 1 )ret = -1 ;
  1559.                 }while( sw ) ;
  1560.                 WGB_rectangle(guiEgbPtr,para);
  1561.                 EGB_writeMode(guiEgbPtr,0);
  1562.                 MG_mosDisp( 3 );
  1563.  
  1564.                 areaFrame.lupx = 0 ;    /* エリア指定は全画面に */
  1565.                 areaFrame.lupy = 0 ;
  1566.                 areaFrame.rdwx = window[act].dx - 1 ;
  1567.                 areaFrame.rdwy = window[act].dy - 1 ;
  1568.                 MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1569.                 break ;
  1570.             }
  1571.             if( ret == 0 )
  1572.             {
  1573.                 if( undoBuf == NULL )    /* アンドゥバッファがない */
  1574.                     makeUndoBuf() ;
  1575.  
  1576.                 if( undoBuf == NULL )
  1577.                 {
  1578.                     pushWaku() ;
  1579.                     errorCheck( OUT_OF_MEMORY ) ;    /* undoBufがない */
  1580.                     popWaku() ;
  1581.                 }
  1582.                 else
  1583.                 {
  1584.                     SetMouse32k( 81, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
  1585.                     execEffect( areaFrame ) ;    /* effect実行ルーチンに */
  1586.                     SetMouse32k( 80, 0x7fff, 0x0 ) ; /* マウスカーソル変更 */
  1587.                     showWaku() ;
  1588.                     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1589.                 }
  1590.             }
  1591.         }
  1592.  
  1593.         error = NOERR ;
  1594.     }
  1595.  
  1596.     /*    消去の時の処理            */
  1597.     else if( messId == MM_ERASE )
  1598.     {
  1599.         /*    ウィンドウの表示枚数を1枚減らす        */
  1600.         windowflg-- ;
  1601.         if( windowflg == 0 )
  1602.         {
  1603.             if( undoLot )                    /* 1994 9 29 バグの個所と見る */
  1604.                 TL_freeLot( undoLot ) ;    /* 今までのアンドゥバッファはチャラ */
  1605.             undoLot =  0 ;    /* lot=0はsystemが利用しているので0はlot未取得に */
  1606.         }
  1607.         /*    表示してないことをしめすためwindowIdを負にする    */
  1608.         window[act].windowId = -(window[act].windowId) ;
  1609.         TL_freeLot( window[act].lot ) ;
  1610.         window[act].buf16m = NULL ;        /* 各バッファアドレスをNULLに */
  1611.         window[act].bufAlpha = NULL ;
  1612.         window[act].buf32k = NULL ;
  1613.         window[act].loadPath[0] = 0 ;    /* file名を消す */
  1614.         window[act].savePath[0] = 0 ;
  1615.  
  1616.         error = NOERR ;
  1617.     }
  1618.  
  1619.     /*    アクティブになった時の処理        */
  1620.     else if( messId == MM_WAKE )
  1621.     {
  1622.         actId = act ;
  1623.  
  1624.         makeUndoBuf() ;            /* アンドゥバッファ作成 */
  1625.  
  1626.         int x0, y0, x1, y1 ;    /* windowユーザエリア検出用変数 */
  1627.  
  1628.         MMI_SendMessage( kobj , MM_GETUSER , 2 , &org , &size ) ;
  1629.         MMI_SendMessage( kobj , MM_GETHYPER , 1 , &winhyp ) ;
  1630.         x0 = winhyp.fr.lupx + org.lupx ;
  1631.         y0 = winhyp.fr.lupy + org.lupy ;
  1632.         x1 = x0 + org.rdwx - 1 ;
  1633.         y1 = y0 + org.rdwy - 1 ;
  1634.  
  1635.         MOS_rdpos(&sw,&x,&y);
  1636.         if    /* ユーザエリア内でマウスが押されてる場合リリースまで待つ */
  1637.         (
  1638.             (x >= x0) && (x <= x1) &&
  1639.             (y >= y0) && (y <= y1)
  1640.         )
  1641.         {
  1642.             while( sw )
  1643.             {
  1644.                  MOS_rdpos(&sw,&x,&y) ;
  1645.             }
  1646.             MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1647.         }    /* こうしないとwindow切り替え時にeffectが実行されてしまう */
  1648.  
  1649.         error = NOERR ;
  1650.     }
  1651.  
  1652.     return error ;
  1653. }
  1654.  
  1655. /* ウインドウのスクロール操作時に呼ばれる関数 */
  1656. /*    initDataIGRWIN:vscrollId:MJ_SCRLL40の呼び出し関数    */
  1657. /*    initDataIGRWIN:hscrollId:MJ_SCRLL40の呼び出し関数    */
  1658. int    scrollFunc(kobj, messId, argc, pev, trigger)
  1659. int        kobj ;
  1660. int        messId ;
  1661. int        argc ;
  1662. EVENT    *pev ;
  1663. int        trigger ;
  1664. {
  1665.     int        prt , max , min , len , page ;
  1666.  
  1667.     if( kobj == window[actId].hscrollId )
  1668.     {
  1669.         MMI_SendMessage( window[actId].hscrollId, MM_GETSCROLL,
  1670.                                  5, &prt, &min, &max, &len, &page) ;
  1671.         window[actId].ox = prt - min ;
  1672.     }
  1673.     else if( kobj == window[actId].vscrollId )
  1674.     {
  1675.         MMI_SendMessage( window[actId].vscrollId, MM_GETSCROLL,
  1676.                                  5, &prt, &min, &max, &len, &page) ;
  1677.         window[actId].oy = prt - min ;
  1678.     }
  1679.  
  1680.     showActWindow() ;
  1681.  
  1682.     return NOERR ;
  1683. }
  1684.  
  1685. /* ウインドウユーザエリア再表示 */
  1686. static int showActWindow()
  1687. {
  1688.     char para[64] ;
  1689.     char *buf ;
  1690.  
  1691.     WINCLIP    *pwclp ;
  1692.     WINCLIP *pstackVisible ;
  1693.     WINCLIP    *pstackClip ;
  1694.     HYPER    hyp ;
  1695.     FRAME    oFr, sFr, cFr ;
  1696.     POINT    origin, dspOrigin ;
  1697.  
  1698.     if( window[actId].windowId < 0 )return NOERR ;
  1699.  
  1700.     /* クリップ枠,ビジブル枠をウインドウユーザエリア枠に設定 */
  1701.     MMI_SendMessage( window[actId].windowId, MM_GETHYPER, 1, &hyp ) ;
  1702.     MMI_SendMessage( window[actId].windowId, MM_GETUSER, 2, &oFr, &sFr ) ;
  1703.     cFr.lupx = dspOrigin.x = hyp.fr.lupx + oFr.lupx ;
  1704.     cFr.lupy = dspOrigin.y = hyp.fr.lupy + oFr.lupy ;
  1705.     cFr.rdwx = cFr.lupx + oFr.rdwx - 1 ;
  1706.     cFr.rdwy = cFr.lupy + oFr.rdwy - 1 ;
  1707.     MG_PushOrigin( &dspOrigin, &origin ) ;
  1708.     pwclp = WIN_getClipMemory( &cFr, NULL ) ;
  1709.     WIN_pushVisible( WIN_copyClip( pwclp ), &pstackVisible ) ;
  1710.     WIN_pushClip( pwclp, &pstackClip ) ;
  1711.  
  1712.     /* 再表示実行 */
  1713.     MG_mosDisp( 2 );
  1714.     buf = window[actId].buf32k ;
  1715.     if( buf != NULL )
  1716.     {
  1717.         EGB_writeMode(guiEgbPtr,0);    /* XORモードでここに入る場合もあるため */
  1718.         EGB_paintMode(guiEgbPtr,0x222);
  1719.  
  1720.         DWORD( para + 0 ) = (unsigned int)buf ;
  1721.         WORD( para + 4 ) = 0x14 ;
  1722.         WORD( para + 6 ) = - window[actId].ox ;
  1723.         WORD( para + 8 ) = - window[actId].oy ;
  1724.         WORD( para + 10 ) = - window[actId].ox + window[actId].dx - 1 ;
  1725.         WORD( para + 12 ) = - window[actId].oy + window[actId].dy - 1 ;
  1726.         WGB_putBlock( guiEgbPtr, 1, para ) ;
  1727.     }
  1728.     MG_mosDisp( 3 );
  1729.  
  1730.     /* クリップ枠,ビジブル枠を元に戻す */
  1731.     WIN_popClip( pstackClip ) ;
  1732.     WIN_popVisible( pstackVisible ) ;
  1733.     MG_PopOrigin( &origin ) ;
  1734.  
  1735.     return NOERR ;
  1736. }
  1737.  
  1738.  
  1739. /***** アンドゥ *****/
  1740.  
  1741. /* アンドゥバッファ作成 */
  1742. int makeUndoBuf()
  1743. {
  1744.     int dx, dy, ret ;
  1745.  
  1746.     dx = window[actId].dx ;
  1747.     dy = window[actId].dy ;
  1748.  
  1749.     /* undoBuf */
  1750.     if( undoLot )
  1751.     {
  1752.         TL_freeLot( undoLot ) ;    /* 今までのバッファはチャラに */
  1753.         undoLot =  0 ;    /* lot=0はsystemが利用しているので0はlot未取得に */
  1754.     }
  1755.     undoLot =  TL_getLot() ;
  1756.     undoBuf = (char *)TL_mallocMemory( undoLot, dx * dy * 4 ) ;
  1757.                         /* NULLだとeffectルーチンは作業を始めない */
  1758.  
  1759.     if( undoBuf )    /* 残りMEMORYが少ないときはやめ */
  1760.     {
  1761.         if( checkMemory() < MinMem )
  1762.         {
  1763.             TL_freeLot( undoLot ) ;
  1764.             undoLot =  0 ;
  1765.             undoBuf = NULL ;
  1766.         }
  1767.     }
  1768.     else    /* 元々だめなら全部なかったことに */
  1769.     {
  1770.         if( undoLot )
  1771.         {
  1772.             TL_freeLot( undoLot ) ;
  1773.             undoLot =  0 ;
  1774.             undoBuf = NULL ;
  1775.         }
  1776.     }
  1777.  
  1778.     if( undoBuf != NULL )
  1779.     {
  1780.         alphaBuf = undoBuf + dx * dy * 3 ;
  1781.         if( window[actId].buf16m )
  1782.         {
  1783.             trans( window[actId].buf16m, undoBuf, dx*dy*3 ) ;
  1784.             trans( window[actId].bufAlpha, alphaBuf, dx*dy ) ;
  1785.         }
  1786.         ret = NOERR ;
  1787.     }
  1788.     else
  1789.     {
  1790.         alphaBuf = NULL ;
  1791.         ret = OUT_OF_MEMORY ;
  1792.     }
  1793.  
  1794.     return ret ;
  1795. }
  1796.  
  1797. /* アンドゥ関数 */
  1798. /*    initDataIGRDSK:effectUndoMItemId:MJ_MITEML40の呼び出し関数    */
  1799. int    undoFunc(kobj, messId, argc, pev, trigger)
  1800. int        kobj ;
  1801. int        messId ;
  1802. int        argc ;
  1803. EVENT    *pev ;
  1804. int        trigger ;
  1805. {
  1806.     if( windowflg && window[actId].buf16m && undoBuf )
  1807.     {
  1808.         int dx, dy ;
  1809.  
  1810.         SetMouse32k( 81, 0x7fff, 0x0 ) ;    /* マウスカーソルwait表示 */
  1811.  
  1812.         dx = window[actId].dx ;
  1813.         dy = window[actId].dy ;
  1814.  
  1815.         transExg( undoBuf, window[actId].buf16m, dx*dy*3 ) ;
  1816.         transExg( alphaBuf, window[actId].bufAlpha, dx*dy ) ;
  1817.         cov16mTo32k( window[actId].buf16m, window[actId].buf32k, dx*dy ) ;
  1818.  
  1819.         showActWindow() ;
  1820.  
  1821.         SetMouse32k( 80, 0x7fff, 0x0 ) ;    /* マウスカーソル表示変更 */
  1822.     }
  1823.  
  1824.     return NOERR ;
  1825. }
  1826.  
  1827.  
  1828.  
  1829. /*
  1830.  ************************
  1831.  *        汎用ルーチン    *
  1832.  ************************
  1833. */
  1834.  
  1835. /* Window新規作成 */
  1836. /* 引数 タイトル,パス名,ロット,1600万色バッファ,32k色バッファ,絵の横幅,縦幅 */
  1837. static int geneWindow( char *title, char *path, int lot,
  1838. char *buf16m, char *bufAlpha, char *buf32k, int dx, int dy )
  1839. {
  1840.     int        no ;
  1841.     int        wid;    /*    ウィンドウ            */
  1842.     int        vsid;    /*    スクロールバー        */
  1843.     int        hsid;    /*    スクロールバー        */
  1844.     HYPER    winhyp ;
  1845.     HYPER    vschyp ;
  1846.     HYPER    hschyp ;
  1847.     FRAME        org ;
  1848.     FRAME        size ;
  1849.  
  1850.     /*    ウィンドウをこれ以上表示できない */
  1851.     if( windowflg == WINCOUNT )
  1852.         return OUT_OF_WINDOW ;
  1853.  
  1854.     /*    何番目のウィンドウが表示できるか調べる        */
  1855.     for( no = 0 ; no < WINCOUNT ; no++ )
  1856.         if( window[no].windowId < 0 )
  1857.             break ;
  1858.  
  1859.     actId = no;
  1860.     window[no].windowId = -(window[no].windowId) ;
  1861.     wid = window[no].windowId ;
  1862.     vsid = window[no].vscrollId ;
  1863.     hsid = window[no].hscrollId ;
  1864.  
  1865.     _rstrncpy( window[no].loadPath, path, 80 ) ;    /* パス名をcopy */
  1866.     window[no].lot = lot ;
  1867.     window[no].buf16m = buf16m ;
  1868.     window[no].bufAlpha = bufAlpha ;
  1869.     window[no].buf32k = buf32k ;
  1870.     window[no].dx = dx ;
  1871.     window[no].dy = dy ;
  1872.     window[no].ox = 0 ;
  1873.     window[no].oy = 0 ;
  1874.  
  1875.     /*    もとの大きさを取得    */
  1876.     MMI_SendMessage( windowId , MM_GETHYPER , 1 , &winhyp );
  1877.     MMI_SendMessage( vscrollId , MM_GETHYPER , 1 , &vschyp );
  1878.     MMI_SendMessage( hscrollId , MM_GETHYPER , 1 , &hschyp );
  1879.     MMI_SendMessage( windowId , MM_GETUSER , 2 , &org , &size );
  1880.  
  1881.     /* 小さい絵のときはウインドウのサイズを縮める */
  1882.     if( dx < org.rdwx )
  1883.     {
  1884.         org.rdwx = dx ;
  1885.         winhyp.fr.rdwx = org.rdwx
  1886.                + ( SHADE_SIZE + BAR_SIZE ) + winhyp.fr.lupx + org.lupx - 1 ;
  1887.     }
  1888.     if( dy < org.rdwy )
  1889.     {
  1890.         org.rdwy = dy ;
  1891.         winhyp.fr.rdwy = org.rdwy
  1892.                + ( SHADE_SIZE + BAR_SIZE ) + winhyp.fr.lupy + org.lupy - 1 ;
  1893.     }
  1894.     size.rdwx = dx + ( SHADE_SIZE + BAR_SIZE ) + org.lupx ;
  1895.     size.rdwy = dy + ( SHADE_SIZE + BAR_SIZE ) + org.lupy ;
  1896.  
  1897.     /*        スクロールバーのリサイズ処理                            */
  1898.     vschyp.fr.lupx = winhyp.fr.lupx + org.lupx + org.rdwx ;
  1899.     vschyp.fr.rdwy = winhyp.fr.lupy + org.lupy + org.rdwy ;
  1900.     vschyp.fr.rdwx = vschyp.fr.lupx + BAR_SIZE ;
  1901.  
  1902.     hschyp.fr.lupy = winhyp.fr.lupy + org.lupy + org.rdwy ;
  1903.     hschyp.fr.rdwx = winhyp.fr.lupx + org.lupx + org.rdwx ;
  1904.     hschyp.fr.rdwy = hschyp.fr.lupy + BAR_SIZE ;
  1905.  
  1906.     /* ウインドウの大きさの設定 */
  1907.     MMI_SendMessage( window[no].windowId , MM_SETHYPER , 1 , &winhyp ) ;
  1908.     MMI_SendMessage( window[no].vscrollId , MM_SETHYPER , 1 , &vschyp ) ;
  1909.     MMI_SendMessage( window[no].hscrollId , MM_SETHYPER , 1 , &hschyp ) ;
  1910.     MMI_SendMessage( window[no].windowId , MM_SETUSER , 2 , &org , &size ) ;
  1911.  
  1912.     /*    それぞれの部品をくっつける        */
  1913.     MMI_SendMessage( vsid , MM_ATTACH , 1 , wid );
  1914.     MMI_SendMessage( hsid , MM_ATTACH , 1 , wid );
  1915.     MMI_SendMessage( wid , MM_ATTACH , 1 , baseDialogId ) ;
  1916.  
  1917.     /*    ウィンドウのタイトルを設定する            */
  1918.     _rstrncpy( window[no].name , title , 20 ) ;
  1919.     window[no].name[19] = 0 ;
  1920.     MMI_SendMessage( wid , MM_SETMSG , 1 , window[no].name ) ;
  1921.  
  1922.     /*    スクロールバーの値を設定する            */
  1923.     MMI_SendMessage( hsid , MM_SETSCROLL , 5 , 
  1924.                         org.rdwx - 1, org.rdwx - 1, dx - 1,
  1925.                             org.rdwx, 1 ) ;
  1926.     MMI_SendMessage( vsid , MM_SETSCROLL , 5 , 
  1927.                         org.rdwy - 1, org.rdwy - 1, dy - 1,
  1928.                             org.rdwy, 1 ) ;
  1929.  
  1930.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1931.  
  1932.     /*    ウィンドウをアクティブにして表示する        */
  1933.     MMI_SendMessage( window[no].windowId , MM_WAKE , 0 ) ;
  1934.     MMI_SendMessage( window[no].windowId , MM_SHOW , 0 ) ;
  1935.  
  1936.     /*    ウィンドウの表示枚数を1枚増やす        */
  1937.     windowflg++ ;
  1938.  
  1939.     return NOERR ;
  1940. }
  1941.  
  1942. /* カーソルが表示領域に来るようにスクロールさせる */
  1943. setDisplayArea( int x, int y )
  1944. {
  1945.     if( outMode == 0 )return NOERR ;
  1946.  
  1947.     if( (x - outLupx) > (boundWidth/2-1) )
  1948.     {
  1949.         outLupx = x - (boundWidth/2-1) ;
  1950.     }
  1951.     if( outLupx > x )
  1952.     {
  1953.         outLupx = x ;
  1954.     }
  1955.     if( (y - outLupy) > 239 )
  1956.     {
  1957.         outLupy = y - 239 ;
  1958.     }
  1959.     if( outLupy > y )
  1960.     {
  1961.         outLupy = y ;
  1962.     }
  1963.  
  1964.     if( outLupx < 0 )outLupx = 0 ;
  1965.     if( outLupy < 0 )outLupy = 0 ;
  1966.     if( outLupx > (boundWidth/2) )outLupx = (boundWidth/2) ;
  1967.     if( outLupy > 240 )outLupy = 240 ;
  1968.     EGB_displayStart( guiEgbPtr, 1, outLupx, outLupy ) ;
  1969.  
  1970.     return NOERR ;
  1971. }
  1972.  
  1973. /* ウィンドウ番号noを基準としたポリゴンor四角形指定 */
  1974.  
  1975. static polygonLupx, polygonLupy ;
  1976.  
  1977. /* ポリゴン指定を実行しポリゴンの形をXORで描いて残しておく */
  1978. polygon1( int no, FRAME *fr )
  1979. {
  1980.     FRAME org, size ;
  1981.     HYPER winhyp ;
  1982.     char para[64] ;
  1983.     int ret ;
  1984.     int lux, luy, rdx, rdy ;
  1985.  
  1986.     if( window[no].windowId < 0 )return -1 ;
  1987.     MMI_SendMessage( window[no].windowId, MM_GETUSER, 2, &org, &size ) ;
  1988.     MMI_SendMessage( window[no].windowId, MM_GETHYPER, 1, &winhyp ) ;
  1989.  
  1990.     polygonLupx = winhyp.fr.lupx + org.lupx - window[actId].ox ;
  1991.     polygonLupy = winhyp.fr.lupy + org.lupy - window[actId].oy ;
  1992.  
  1993.     WORD( para + 0 ) = 0 ;
  1994.     WORD( para + 2 ) = 0 ;
  1995. //    WORD( para + 4 ) = 511 ;
  1996.     WORD( para + 4 ) = 639 ;
  1997.     WORD( para + 6 ) = 479 ;
  1998.     EGB_viewport( guiEgbPtr, para ) ;
  1999.  
  2000.  
  2001. //    polygon_rectangle_init( guiEgbPtr, polygonBuffer,
  2002. //                                512, 480, 0x7fff, setDisplayArea ) ;
  2003.     polygon_rectangle_init( guiEgbPtr, polygonBuffer,
  2004.                                 640, 480, 0x7fff, setDisplayArea ) ;
  2005.     /* egbワーク, ポリゴン作業領域, 横, 縦, 表示色, 表示設定関数 */
  2006.  
  2007.     MG_mosDisp( 0 );
  2008.     ret = polygon_1st( &lux, &luy, &rdx, &rdy ) ;
  2009.     MG_mosDisp( 1 );
  2010.  
  2011.     fr->lupx = lux - polygonLupx ;
  2012.     fr->lupy = luy - polygonLupy ;
  2013.     fr->rdwx = rdx - polygonLupx ;
  2014.     fr->rdwy = rdy - polygonLupy ;
  2015.  
  2016.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  2017.  
  2018.     return ret ;
  2019. }
  2020.  
  2021. /* ポリゴンの形をXORで描く */
  2022. polygon2()
  2023. {
  2024.     MG_mosDisp( 0 );
  2025.     polygon_2nd() ;
  2026.     MG_mosDisp( 1 );
  2027.  
  2028.     return NOERR ;
  2029. }
  2030.  
  2031. /* 四角形指定を実行し四角形の形をXORで描いて残しておく */
  2032. rectangle1( int no, FRAME *fr )
  2033. {
  2034.     FRAME org, size ;
  2035.     HYPER winhyp ;
  2036.     char para[64] ;
  2037.     int ret ;
  2038.     int lux, luy, rdx, rdy ;
  2039.  
  2040.     if( window[no].windowId < 0 )return -1 ;
  2041.     MMI_SendMessage( window[no].windowId, MM_GETUSER, 2, &org, &size ) ;
  2042.     MMI_SendMessage( window[no].windowId, MM_GETHYPER, 1, &winhyp ) ;
  2043.  
  2044.     polygonLupx = winhyp.fr.lupx + org.lupx - window[actId].ox ;
  2045.     polygonLupy = winhyp.fr.lupy + org.lupy - window[actId].oy ;
  2046.  
  2047.     WORD( para + 0 ) = 0 ;
  2048.     WORD( para + 2 ) = 0 ;
  2049. //    WORD( para + 4 ) = 511 ;
  2050.     WORD( para + 4 ) = 639 ;
  2051.     WORD( para + 6 ) = 479 ;
  2052.     EGB_viewport( guiEgbPtr, para ) ;
  2053.  
  2054. //    polygon_rectangle_init( guiEgbPtr, polygonBuffer,
  2055. //                                512, 480, 0x7fff, setDisplayArea ) ;
  2056.     polygon_rectangle_init( guiEgbPtr, polygonBuffer,
  2057.                                 640, 480, 0x7fff, setDisplayArea ) ;
  2058.     /* egbワーク, ポリゴン作業領域, 横, 縦, 表示色, 表示設定関数 */
  2059.  
  2060.     MG_mosDisp( 0 );
  2061.     ret = rectangle_1st( &lux, &luy, &rdx, &rdy ) ;
  2062.     MG_mosDisp( 1 );
  2063.  
  2064.     fr->lupx = lux - polygonLupx ;
  2065.     fr->lupy = luy - polygonLupy ;
  2066.     fr->rdwx = rdx - polygonLupx ;
  2067.     fr->rdwy = rdy - polygonLupy ;
  2068.  
  2069.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  2070.  
  2071.     return ret ;
  2072. }
  2073.  
  2074. /* ポリゴンの形をXORで描く */
  2075. rectangle2()
  2076. {
  2077.     MG_mosDisp( 0 );
  2078.     rectangle_2nd() ;
  2079.     MG_mosDisp( 1 );
  2080.  
  2081.     return NOERR ;
  2082. }
  2083.  
  2084. /* ポリゴンor四角形の領域判定値を取得(領域内なら1 外なら0) */
  2085. static getArea( x, y )
  2086. {
  2087.     return polygon_rectangle_read( x + polygonLupx, y + polygonLupy ) ;
  2088. }
  2089.  
  2090. /* 残りメモリをチェック */
  2091. static int checkMemory()
  2092. {
  2093. /*
  2094.     int ph, lg ;
  2095.  
  2096.     ph = TL_checkMemory( 0 ) ;
  2097.     lg = TL_checkMemory( 2 ) ;
  2098.  
  2099.     return (( ph < lg ) ? ph : lg )*4096 ;
  2100. */
  2101.     return TL_checkMemory( 1 )*4096 ;
  2102. }
  2103.  
  2104. /* 転送 buf1 → buf2 n Byte */
  2105. static int trans( char *buf1, char *buf2, int n )
  2106. {
  2107.     int i, j, n1, n2 ;
  2108.  
  2109.     n1 = ( n / 4 ) << 2 ;
  2110.     n2 = n % 4 ;
  2111.     for( i=0 ; i<n1 ; i += 4 )
  2112.         DWORD( buf2 + i ) = DWORD( buf1 + i ) ;
  2113.     if( n2 )
  2114.         for( j=0 ; j<n2 ; j++ )
  2115.             BYTE( buf2 + i + j ) = BYTE( buf1 + i + j ) ;
  2116.     return NOERR ;
  2117. }
  2118.  
  2119. /* 交換 buf1 ←→ buf2 n Byte */
  2120. static int transExg( char *buf1, char *buf2, int n )
  2121. {
  2122.     int i, j, n1, n2, temp ;
  2123.  
  2124.     n1 = ( n / 4 ) << 2 ;
  2125.     n2 = n % 4 ;
  2126.     for( i=0 ; i<n1 ; i += 4 )
  2127.     {
  2128.         temp = DWORD( buf1 + i ) ;
  2129.         DWORD( buf1 + i ) = DWORD( buf2 + i ) ;
  2130.         DWORD( buf2 + i ) = temp ;
  2131.     }
  2132.     if( n2 )
  2133.         for( j=0 ; j<n2 ; j++ )
  2134.         {
  2135.             temp = BYTE( buf1 + i + j ) ;
  2136.             BYTE( buf1 + i + j ) = BYTE( buf2 + i + j ) ;
  2137.             BYTE( buf2 + i + j ) = temp ;
  2138.         }
  2139.     return NOERR ;
  2140. }
  2141.  
  2142. /* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
  2143. file_kakuchousi_set( fullname, name, kakuchou )
  2144. char fullname[], name[], kakuchou[];
  2145. {
  2146.     int i;
  2147.  
  2148.     for( i=0 ; i<76 ; i++ ){
  2149.         fullname[i] = name[i];
  2150.         if( name[i] == '.' || name[i] == (char)0 )goto mov01;
  2151.     }
  2152.     return ILLEGAL_FILENAME;        /* bad file name */
  2153. mov01:    if( i == 0 )return ILLEGAL_FILENAME;
  2154.     if( name[i-1] == '\\' )return ILLEGAL_FILENAME;
  2155.     DWORD( fullname + i ) = DWORD( kakuchou );
  2156.     fullname[i+4] = (char)0;
  2157.     return NOERR;
  2158. }
  2159.  
  2160. /*    ファイル選択    */
  2161. int    fileSelecter( path, ExtStr, title, exec, cncl )
  2162. char    *path ;
  2163. char    **ExtStr ;
  2164. char    *title ;
  2165. char    *exec ;
  2166. char    *cncl ;
  2167. {
  2168.     char pathName[100], name[20] ;
  2169.     int                 i, j, n ;
  2170.     unsigned int    MSlctCnt ;
  2171.     int          Atr, ret, ret2 ;
  2172.     FRAME                 Frm ;
  2173.     int             alertobj ;
  2174.  
  2175.     ret2 = NOERR ;
  2176.  
  2177.     FDG_GetFrame( &Frm ) ;    /* センタリング */
  2178.     Frm.lupx = 256 - ( Frm.rdwx - Frm.lupx ) / 2 ;
  2179.     Frm.lupy = 240 - ( Frm.rdwy - Frm.lupy ) / 2 ;
  2180.     FDG_SetFrame( Frm ) ;
  2181.     /* センタリングの後fileSubDialogIdをデタッチすると,位置がずれない */
  2182.     MMI_SendMessage( fileSubDialogId, MM_DETACH, 0 ) ;
  2183.  
  2184.     n = 0 ;
  2185.     for( i=0 ; i<79 ; i++ )
  2186.     {
  2187.         pathName[i] = path[i] ;
  2188.         if( path[i] == '\\' )
  2189.             n++ ;
  2190.         if( path[i] == '\0' )
  2191.             break ;
  2192.     }
  2193.     if( n <= 1 )
  2194.     {
  2195.         for( i=i ; i>=0 ; i-- )
  2196.         {
  2197.             if( path[i] == '\\' )
  2198.             {
  2199.                 i++ ;
  2200.                 pathName[i] = '\0' ;
  2201.                 break ;
  2202.             }
  2203.         }
  2204.         for( j=0 ; j<13 ; j++ )
  2205.         {
  2206.             name[j] = path[i+j] ;
  2207.         }
  2208.     }
  2209.     else
  2210.     {
  2211.         for( i=i ; i>=0 ; i-- )
  2212.         {
  2213.             if( path[i] == '\\' )
  2214.             {
  2215.                 pathName[i] = '\0' ;
  2216.                 break ;
  2217.             }
  2218.         }
  2219.         for( j=0 ; j<13 ; j++ )
  2220.         {
  2221.             name[j] = path[i+1+j] ;
  2222.         }
  2223.     }
  2224.  
  2225.     ret = FDG_SetFileText( name ) ;
  2226.     ret = FDG_SetTitle( title, exec, cncl ) ;
  2227.  
  2228.     alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避     */
  2229.     MMI_SetAlertObj( FDG_GetMainID() ) ;
  2230.     ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY,
  2231.          pathName, ExtStr,    &MSlctCnt) ;    /* LOAD時にはテキストをださない */
  2232.     if( ret < 0 )    /* PATHが間違ってる場合はカレントディレクトリで */
  2233.     {
  2234.         name[0] = '\0' ;
  2235.         ret = FDG_SetFileText( name ) ;
  2236.         ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY,
  2237.              NULL, ExtStr,    &MSlctCnt) ;
  2238.     }
  2239.     MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す        */
  2240.  
  2241.     if( (ret == 1) && (MSlctCnt > 0) )    /*    正しくファイル名を収得したか?    */
  2242.     {
  2243.         FDG_GetPathName( path, &Atr, 0 ) ;
  2244.     }
  2245.     else
  2246.     {
  2247.         ret2 = 1 ;
  2248.     }
  2249.     return ret2 ;
  2250. }
  2251.  
  2252. /*    ファイル選択オプション付き    */
  2253. int    fileSelecter2( path, ExtStr, title, exec, cncl )
  2254. char    *path ;
  2255. char    **ExtStr ;
  2256. char    *title ;
  2257. char    *exec ;
  2258. char    *cncl ;
  2259. {
  2260.     char pathName[100], name[20] ;
  2261.     int                 i, j, n ;
  2262.     unsigned int    MSlctCnt ;
  2263.     int          Atr, ret, ret2 ;
  2264.     FRAME                  Frm ;
  2265.     int               baseId ;
  2266.     int             alertobj ;
  2267.  
  2268.     ret2 = NOERR ;
  2269.  
  2270.     FDG_GetFrame( &Frm ) ;    /* センタリング */
  2271.     Frm.lupx = 256 - ( Frm.rdwx - Frm.lupx ) / 2 ;
  2272.     Frm.lupy = 240 - ( Frm.rdwy - Frm.lupy ) / 2 ;
  2273.     FDG_SetFrame( Frm ) ;
  2274.     /* センタリングの後fileSubDialogIdをアタッチすると,位置がずれない */
  2275.     baseId = FDG_GetMainID() ;
  2276.     MMI_SendMessage( fileSubDialogId, MM_ATTACH, 1, baseId ) ;
  2277.     MTL_setFlagObj( fileBtnId[saveMode], (MS_UNSELECT | MS_TOGGLE) ) ;
  2278.     if( saveCompMode )
  2279.         MTL_setFlagObj( fileBtnId[2], MS_TOGGLE ) ;
  2280.     else
  2281.         MTL_resetFlagObj( fileBtnId[2], (~MS_TOGGLE) ) ;
  2282.  
  2283.     n = 0 ;
  2284.     for( i=0 ; i<79 ; i++ )
  2285.     {
  2286.         pathName[i] = path[i] ;
  2287.         if( path[i] == '\\' )
  2288.             n++ ;
  2289.         if( path[i] == '\0' )
  2290.             break ;
  2291.     }
  2292.     if( n <= 1 )
  2293.     {
  2294.         for( i=i ; i>=0 ; i-- )
  2295.         {
  2296.             if( path[i] == '\\' )
  2297.             {
  2298.                 i++ ;
  2299.                 pathName[i] = '\0' ;
  2300.                 break ;
  2301.             }
  2302.         }
  2303.         for( j=0 ; j<13 ; j++ )
  2304.         {
  2305.             name[j] = path[i+j] ;
  2306.         }
  2307.     }
  2308.     else
  2309.     {
  2310.         for( i=i ; i>=0 ; i-- )
  2311.         {
  2312.             if( path[i] == '\\' )
  2313.             {
  2314.                 pathName[i] = '\0' ;
  2315.                 break ;
  2316.             }
  2317.         }
  2318.         for( j=0 ; j<13 ; j++ )
  2319.         {
  2320.             name[j] = path[i+1+j] ;
  2321.         }
  2322.     }
  2323.  
  2324.     ret = FDG_SetFileText( name ) ;
  2325.     ret = FDG_SetTitle( title, exec, cncl ) ;
  2326.  
  2327.     alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避     */
  2328.     MMI_SetAlertObj( FDG_GetMainID() ) ;
  2329.     ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
  2330.          pathName, ExtStr,    &MSlctCnt) ;
  2331.     if( ret < 0 )    /* PATHが間違ってる場合はカレントディレクトリで */
  2332.     {
  2333.         name[0] = '\0' ;
  2334.         ret = FDG_SetFileText( name ) ;
  2335.         ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
  2336.              NULL, ExtStr,    &MSlctCnt) ;
  2337.     }
  2338.     MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す        */
  2339.  
  2340.     if( (ret == 1) && (MSlctCnt > 0) )    /*    正しくファイル名を収得したか?    */
  2341.     {
  2342.         FDG_GetPathName( path, &Atr, 0 ) ;
  2343.     }
  2344.     else
  2345.     {
  2346.         ret2 = 1 ;
  2347.     }
  2348.     return ret2 ;
  2349. }
  2350.  
  2351. /* 色数モードの設定 */
  2352. /*    initDataIGRFILE:fileBtnId[0]:MJ_TICONL40の呼び出し関数    */
  2353. /*    initDataIGRFILE:fileBtnId[1]:MJ_TICONL40の呼び出し関数    */
  2354. int    fileModeSet(kobj, messId, argc, pev, trigger)
  2355. int        kobj ;
  2356. int        messId ;
  2357. int        argc ;
  2358. EVENT    *pev ;
  2359. int        trigger ;
  2360. {
  2361.     int i ;
  2362.  
  2363.     for( i=0 ; i<2 ; i++ )
  2364.     {
  2365.         if( kobj == fileBtnId[i] )
  2366.             break ;
  2367.     }
  2368.     if( i < 2 )
  2369.     {
  2370.         MTL_setFlagObj( fileBtnId[i], MS_UNSELECT ) ;
  2371.         MTL_resetFlagObj( fileBtnId[saveMode],
  2372.                             (~(MS_UNSELECT | MS_TOGGLE)) ) ;
  2373.         MMI_SendMessage( fileBtnId[saveMode], MM_SHOW, 0 ) ;
  2374.         saveMode = i ;
  2375.     }
  2376.     return NOERR ;
  2377. }
  2378.  
  2379. /* 圧縮モードの設定 */
  2380. /*    initDataIGRFILE:fileBtnId[2]:MJ_TICONL40の呼び出し関数    */
  2381. int    fileCompModeSet(kobj, messId, argc, pev, trigger)
  2382. int        kobj ;
  2383. int        messId ;
  2384. int        argc ;
  2385. EVENT    *pev ;
  2386. int        trigger ;
  2387. {
  2388.     if( MTL_checkFlagObj( kobj, MS_TOGGLE ) )
  2389.         saveCompMode = 1 ;
  2390.     else
  2391.         saveCompMode = 0 ;
  2392.     return NOERR ;
  2393. }
  2394.  
  2395. /*    パレット設定 (これは16色モード専用のもので32k色では使わない)    */
  2396. int    setTmenuPalette()
  2397. {
  2398.     char    para[16*8+4] ;
  2399.     int        ptr ;
  2400.  
  2401.     ptr = 4 ;
  2402.  
  2403.     void     set1Pal( int col, int b, int r, int g )
  2404.     {
  2405.         DWORD(para + ptr) = col ;
  2406.         BYTE(para + ptr + 4) = b * 16 ;
  2407.         BYTE(para + ptr + 5) = r * 16 ;
  2408.         BYTE(para + ptr + 6) = g * 16 ;
  2409.         BYTE(para + ptr + 7) = 0 ;
  2410.         ptr += 8 ;
  2411.     }
  2412.  
  2413.     DWORD(para + 0) = 16 ;
  2414.     set1Pal( 0, 0, 0, 0 ) ;
  2415.     set1Pal( 1, 4, 4, 8 ) ;
  2416.     set1Pal( 2, 4, 12, 6 ) ;
  2417.     set1Pal( 3, 5, 5, 5 ) ;        //         set1Pal( 3, 10, 15, 12 ) ;
  2418.     set1Pal( 4, 9, 9, 9 ) ;
  2419.     set1Pal( 5, 7, 0, 12 ) ;
  2420.     set1Pal( 6, 12, 12, 12 ) ;
  2421.     set1Pal( 7, 7, 7, 7 ) ;
  2422.     set1Pal( 8, 2, 2, 2 ) ;
  2423.     set1Pal( 9, 8, 10, 12 ) ;    /* file selector */
  2424.     set1Pal( 10, 0, 13, 0 ) ;
  2425.     set1Pal( 11, 10, 0, 0 ) ;
  2426.     set1Pal( 12, 0, 0, 15 ) ;
  2427.     set1Pal( 13, 15, 0, 15 ) ;
  2428.     set1Pal( 14, 0, 15, 13 ) ;
  2429.     set1Pal( 15, 15, 15, 15 ) ;
  2430.  
  2431.     EGB_setTmenuPalette( para ) ;
  2432.  
  2433.     return NOERR ;
  2434. }
  2435.  
  2436. /* スリープ時の設定 */
  2437. int sleepSet()
  2438. {
  2439.     /*    拡大表示中は元にもどす    */
  2440.     if( outMode )
  2441.         displayOutFunc( outIconId ) ;
  2442.  
  2443.     return NOERR ;
  2444. }
  2445.  
  2446. /*    終了処理    */
  2447. int    quitFunc()
  2448. {
  2449.     MMI_SetHaltFlag( TRUE ) ;
  2450.     return NOERR ;
  2451. }
  2452.  
  2453. /*    終了可能なら終了する処理    */
  2454. int    quitFunc2()
  2455. {
  2456.     if( MTL_checkAtrObj( baseDialogId, MS_DSPONLYL40 ) == 0 )
  2457.     {
  2458.         MMI_SetHaltFlag( TRUE ) ;
  2459.         return NOERR ;
  2460.     }
  2461.     return ILLEGAL_FUNCTION ;
  2462. }
  2463.  
  2464. /*    あばうと表示    */
  2465. int    aboutFunc()
  2466. {
  2467.     MMI_SendMessage( aboutNumId, MM_SETNUMBOX, 5,
  2468.              checkMemory(), 0, 0x7fffffff, 1, 0 ) ;
  2469.  
  2470.     MMI_SendMessage( alertId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  2471.     MMI_SendMessage( alertId, MM_SHOW, 0 ) ;
  2472.     return NOERR ;
  2473. }
  2474.  
  2475. /*    あばうと表示確認    */
  2476. int    aboutOKFunc(kobj, messId, argc, pev, trigger)
  2477. int        kobj ;
  2478. int        messId ;
  2479. int        argc ;
  2480. EVENT    *pev ;
  2481. int        trigger ;
  2482. {
  2483.     MMI_SendMessage( alertId, MM_ERASE, 0 ) ;
  2484.     MMI_SendMessage( alertId, MM_DETACH, 0 ) ;
  2485.     return NOERR ;
  2486. }
  2487.  
  2488. /* error 表示ルーチン */
  2489. int errorCheck(number)
  2490. int number;
  2491. {
  2492. /*
  2493. #define    OUT_OF_MEMORY        7
  2494. #define    ILLEGAL_FILENAME    55
  2495. #define    ILLEGAL_DATA        58
  2496. #define    CANT_LOAD            1
  2497. #define    READ_FAIL            1
  2498. #define    CANT_SAVE            2
  2499. #define    WRITE_FAIL            2
  2500. #define    OUT_OF_WINDOW        1001
  2501. #define    NO_WINDOW            1002
  2502. */
  2503.  
  2504.     MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2505.          "エラーが発生しました。" ) ;
  2506.     if( number == OUT_OF_MEMORY )
  2507.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2508.          "メモリが足りません。" ) ;
  2509.     if( number == ILLEGAL_FILENAME )
  2510.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2511.          "ファイル名が正しくありません。" ) ;
  2512.     if( number == ILLEGAL_DATA )
  2513.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2514.          "未知のデータ形式です。" ) ;
  2515.     if( number == READ_FAIL )
  2516.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2517.          "ロードできませんでした。" ) ;
  2518.     if( number == WRITE_FAIL )
  2519.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2520.          "セーブできませんでした。" ) ;
  2521.     if( number == OUT_OF_WINDOW )
  2522.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2523.          "これ以上ウィンドウは開けません。" ) ;
  2524.     if( number == NO_WINDOW )
  2525.         MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
  2526.          "ウィンドウが開かれてません。" ) ;
  2527.  
  2528.     int wakeObj ;
  2529.  
  2530.     wakeObj = MMI_GetWakeObj() ;
  2531.     MMI_SetWakeObj( UNUSED ) ;
  2532.  
  2533.     MMI_SendMessage( errorId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  2534.     MMI_SendMessage( errorId, MM_SHOW, 0 ) ;
  2535.  
  2536.     MMI_ExecSystem() ;
  2537.  
  2538.     MMI_SendMessage( errorId, MM_ERASE, 0 ) ;
  2539.     MMI_SendMessage( errorId, MM_DETACH, 0 ) ;
  2540.  
  2541.     MMI_SetWakeObj( wakeObj ) ;
  2542.  
  2543.     return NOERR;
  2544. }
  2545.  
  2546. /*    エラー表示確認    */
  2547. int    errorOKFunc(kobj, messId, argc, pev, trigger)
  2548. int        kobj ;
  2549. int        messId ;
  2550. int        argc ;
  2551. EVENT    *pev ;
  2552. int        trigger ;
  2553. {
  2554.     MMI_SetHaltFlag( TRUE ) ;
  2555.     return NOERR ;
  2556. }
  2557.  
  2558. /* 準備 */
  2559. int startSet()
  2560. {
  2561.     int i ;
  2562.  
  2563.     for( i=0 ; i<EFFECTCOUNT ; i++ )
  2564.     {
  2565.         if( effectSet[i].title[0] )
  2566.             MMI_SendMessage( effectMItemId[i], MM_SETMSG,
  2567.                                         1, effectSet[i].title ) ;
  2568.         else
  2569.             MMI_SendMessage( effectMItemId[i], MM_DETACH, 0 ) ;
  2570.  
  2571.     }
  2572.     return NOERR ;
  2573. }
  2574.  
  2575.